Я пытаюсь найти все пути на графике. Я нашел эту удивительную функцию, которую я воспроизводил здесь :
def paths(graph, v):
"""Generate the maximal cycle-free paths in graph starting at v.
graph must be a mapping from vertices to collections of
neighbouring vertices.
>>> g = {1: [2, 3], 2: [3, 4], 3: [1], 4: []}
>>> sorted(paths(g, 1))
[[1, 2, 3], [1, 2, 4], [1, 3]]
>>> sorted(paths(g, 3))
[[3, 1, 2, 4]]
"""
path = [v] # path traversed so far
seen = {v} # set of vertices in path
def search():
dead_end = True
for neighbour in graph[path[-1]]:
if neighbour not in seen:
dead_end = False
seen.add(neighbour)
path.append(neighbour)
yield from search()
path.pop()
seen.remove(neighbour)
if dead_end:
yield list(path)
yield from search()
Однако, как показывает информация, представленная в функции, эта функция возвращает пути, которые завершились, то есть попали в тупик , Я хотел бы изменить функцию для получения неполных путей, чтобы sorted(paths(g,1))
возвращал [[1], [1,2], [1,2,3], [1,2,4], [1,3]]
.
Я попытался добавить эту строку if not dead_end: yield list(path)
перед строкой, которая говорит path.pop()
. Но это приводит к тому, что несколько путей приводят к двум путям и не дают пути к одному узлу. Результат, который я получил, был [[1, 2, 3], [1, 2, 3], [1, 2, 4], [1, 2, 4], [1, 2], [1, 3], [1, 3]]
, что не то, что я хочу!
Можно ли изменить этот код, чтобы получить "незавершенные" пути? Не могли бы вы посоветовать мне, как go об этом?