生成树DFS算法不会创建树

时间:2015-02-11 16:47:29

标签: algorithm theory graph-theory spanning-tree

我写了这个伪代码来创建一个非定向图(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')

由于某种原因,这个算法是错误的。例如,让我们考虑这个简单的非定向图:
enter image description here

如果我们从第一个顶点开始,我们访问它,然后我们将2和3推入堆栈,我们创建两个边:(1,2)和(1,3)。然后我们访问3,因为它连接到尚未访问的2,我们还创建了一个边(3,2),但是这创建了一个循环,因此计算的生成树不是树。错误在哪里?我无法想象在O(n)中计算生成树的另一种方法。

2 个答案:

答案 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')