有向树中一个节点到另一个节点的所有路径(igraph)
1 个回答
18
你想要找出在一个有向无环图(DAG)中,从一个节点到另一个节点的所有路径。
树结构总是一个DAG,但DAG不一定是树。它们的区别在于,树的分支不能合并,只能分开,而DAG的分支可以汇聚在一起,只要不形成循环就可以。
你可以在“Python Patterns - Implementing Graphs.”中找到名为find_all_paths()
的解决方案。要和igraph一起使用,需要稍微调整一下。我没有安装igraph,但用模拟的方法,这段代码似乎可以工作:
def adjlist_find_paths(a, n, m, path=[]):
"Find paths from node index n to m using adjacency list a."
path = path + [n]
if n == m:
return [path]
paths = []
for child in a[n]:
if child not in path:
child_paths = adjlist_find_paths(a, child, m, path)
for child_path in child_paths:
paths.append(child_path)
return paths
def paths_from_to(graph, source, dest):
"Find paths in graph from vertex source to vertex dest."
a = graph.get_adjlist()
n = source.index
m = dest.index
return adjlist_find_paths(a, n, m)
文档中没有明确说明邻接列表(adjlist)是一个包含顶点索引的列表的列表,还是一个包含顶点对象的列表的列表。我假设这些列表包含索引,以便简化邻接列表的使用。因此,返回的路径是以顶点索引的形式呈现的。如果你需要顶点对象,你需要将这些索引映射回顶点对象,或者调整代码以添加顶点本身,而不是它的索引。