Я написал этот псевдокод для создания связующего дерева из неориентированного графа (G, V), где S - это стек, а v - это вершина, из которой мы хотим запустить расчет:Алгоритм Spanning tree DFS не создает дерево
PROCEDURE SPANNING-TREE(G,v)
S := {v}
while S is not empty
u := pop(S)
visit u
for each u' connected to u
if u' is not visited
s.push(u')
add-edge(u,u')
По какой-то причине этот алгоритм неверен. Например, давайте рассмотрим этот простой нон ориентированный граф:
Если мы будем исходить из первой вершины, мы посещаем его, а затем мы нажимаем 2 и 3 в стек и мы создаем два ребра: (1,2) и (1,3). Затем мы посещаем 3, и поскольку он связан с 2, который еще не был посещен, мы также создаем ребро (3,2), но это создает цикл, поэтому вычисленное остовное дерево не является деревом. Где ошибка? Я не могу представить другой способ вычисления остовного дерева в O (n).