检测图中的相互边
detecting mutual edges in a graph
我有一个图的邻接表表示,但它不是对称的,即。如果节点 A
有一条边到 B
,那么 B
有一条边到 A
是不正确的。我猜这将是一个有向图(digraph)。
从一个节点检测所有双向路径的好方法是什么。我知道我可以使用 DFS 来检测从一个节点到图中另一个节点的路径。我想我正在寻找的是双向 DFS,其中只考虑双向边缘。
因此,一种方法是查看节点的邻居并确定这是否是双向关系。但是,为此我需要遍历该相邻节点的所有直接连接,并查看第一个节点是否也是一个连接,如果是,则继续递归。我想知道这是否是一种有效的方法?
使用相当标准的 "adjacency set" 表示,您可以使用某种集合数据结构(基于散列或树)而不是列表来表示从节点出来的边,您可以只查询图中是否存在边的反转版本。从邻接表表示构建邻接集表示很简单。
或者,您可以构建图中所有边的一组,然后从图中过滤出反向版本不在该集中的边。如果您在其他方法中使用邻接集表示后不会再使用它,那么这会更方便。如果你想降低内存使用率,如果你在图中找到它们的反转版本,你可以在构建它时从集合中删除边缘,然后如果它们在集合中而不是如果它们的反转版本则从图中删除边缘不是。
我有一个图的邻接表表示,但它不是对称的,即。如果节点 A
有一条边到 B
,那么 B
有一条边到 A
是不正确的。我猜这将是一个有向图(digraph)。
从一个节点检测所有双向路径的好方法是什么。我知道我可以使用 DFS 来检测从一个节点到图中另一个节点的路径。我想我正在寻找的是双向 DFS,其中只考虑双向边缘。
因此,一种方法是查看节点的邻居并确定这是否是双向关系。但是,为此我需要遍历该相邻节点的所有直接连接,并查看第一个节点是否也是一个连接,如果是,则继续递归。我想知道这是否是一种有效的方法?
使用相当标准的 "adjacency set" 表示,您可以使用某种集合数据结构(基于散列或树)而不是列表来表示从节点出来的边,您可以只查询图中是否存在边的反转版本。从邻接表表示构建邻接集表示很简单。
或者,您可以构建图中所有边的一组,然后从图中过滤出反向版本不在该集中的边。如果您在其他方法中使用邻接集表示后不会再使用它,那么这会更方便。如果你想降低内存使用率,如果你在图中找到它们的反转版本,你可以在构建它时从集合中删除边缘,然后如果它们在集合中而不是如果它们的反转版本则从图中删除边缘不是。