Ответ 1
Вы ищете все пути между одним node и другим в направленном ациклическом графе (DAG).
Дерево всегда является DAG, но DAG не всегда является деревом. Разница в том, что ветки дерева не допускаются к объединению, только делятся, а ветки DAG могут течь вместе, пока не вводятся никакие циклы.
Ваше решение можно найти как find_all_paths()
в "Python Patterns - Реализация графов." Это требует небольшой адаптации для использования с igraph. У меня не установлен igraph, но, используя mocks, это работает:
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 списком индексов вершин или списком самих объектов вершин. Я предположил, что в списках содержатся индексы, чтобы упростить использование adjlist. В результате возвращенные пути находятся в терминах индексов вершин. Вам нужно будет сопоставить их обратно с объектами вершин, если они вам нужны, или адаптировать код, чтобы добавить вершину, а не ее индекс.