您正在寻找有向无环图(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是否是顶点索引列表的列表或列表清单的顶点对象本身。我认为列表中包含索引以简化使用调整列表。结果,返回的路径是按照顶点索引。如果您需要这些对象,则必须将它们映射回顶点对象,或者调整代码以追加顶点而不是索引。
只要这两个节点都可以到达另一个节点,就可以通过在到达目标节点之前反复遍历一条边来构建无限多的路径。出于这个原因,所有可能路径的非终止列表不太可能对你有好处。你真的想找什么,为什么? – 2010-10-19 20:34:26
@Jeremy W. Sherman,我不得不提到我说的图真的是一棵树。查看我的编辑以澄清情况 – 2010-10-19 21:02:55