您正在尋找有向無環圖(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