Вы ищете все пути между одним узлом и другим в ориентированном ациклическом графе (DAG).
Дерево всегда DAG, но DAG не всегда дерево. Разница в том, что ветви дерева не могут объединяться, только делятся, тогда как ветви группы обеспечения доступности баз данных могут объединяться, пока не введены циклы.
Ваше решение можно найти как find_all_paths()
в «Шаблоны Python - Реализация графиков». Это требует небольшой адаптации для использования с 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)
Из документации было неясно, является ли прилагательный список списками индексов вершин или списком самих объектов вершин. Я предположил, что списки содержали индексы, чтобы упростить использование адлиста. В результате возвращаемые пути выражаются в виде индексов вершин. Вам придется сопоставить их с объектами вершин, если они вам нужны, или адаптировать код для добавления вершины, а не ее индекса.