Корректный обход графа. Можно ли оптимизировать?
Граф задан в виде словаря смежности. Нужно обойти вершины графа (в данном случае итеративный DFS)
def iteractive_dfs(graph, start, path=None):
if path is None:
path = []
q = [start]
while q:
v = q.pop()
print(v)
if v not in path: # new point
path = path + [v]
# need add to stack visited point first
# l1 = list(graph[v])
# for point in l1:
# if point in path:
# q.append(point)
# l1.remove(point)
# break
# q += l1
q +=graph[v]
return path
graph = {0: [6, 8, 3, 5], 1: [2, 7], 2: [1, 5], 3: [0, 4], 4: [3], 5: [0, 2], 6: [0], 7: [1], 8: [0]}
iteractive_dfs(graph, 0) # начинаем обход с вершины 0
В нашем случае получаем траекторию обхода: 0 - 5 - 2 - 5 - 1 - 7 - 1 - 2 - 0 - 3 - 4.
Но, по логике вещей, корректной должна быть: 0 - 5 - 2 - 1 - 7 - 1 - 2 - 5 - 0 - 3 - 4
Т.е. при добавлении из словаря вверху стека должны оказаться непосещенные вершины
Этого можно добиться, если использовать закомментированный фрагмент кода и убрав
q +=graph[v]
Но есть опасение, что данная конструкция не оптимальна по времени выполнения для больших графов.
Можно ли оптимизировать?
Спасибо.