我写了这个伪代码来创建一个非定向图(G,V)的生成树,其中S是一个堆栈,v是我们想要开始计算的顶点:
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)中计算生成树的另一种方法。
答案 0 :(得分:3)
当您将顶点推送到堆栈时,您可以将顶点标记为已访问,而不是在弹出它时。
答案 1 :(得分:2)
这将是我的代码。这里visited[]
是一个布尔数组或哈希表
PROCEDURE SPANNING-TREE(G, v)
S := {v}
visited[v] := true
while S is not empty
u := pop(S)
for each u' connected to u
if u' is not visited
visited[u'] := true
s.push(u')
add-edge(u, u')