深度优先搜索算法 - 计算连通分量

时间:2016-03-31 18:35:22

标签: algorithm depth-first-search

大家好我有疑问并且需要帮助。也许它是offtopic但我已经在Code Review上发布了它但没有人回答。我用伪代码编写了这个,我被卡住了。我应该检查一个连接组件中的顶点数是否均匀。我的想法是实现DFS并放置一个计数器然后检查计数器%2 == 0是否。我的问题是我不知道在哪里放柜台。 让我们说DFS:是主要方法。

G =(V,E)V-顶点,E-边缘 s-start point(vertex)

DFS(G,s):
boolean result <-- false
Discovered[v] <-- false for all Vertices V(v)
DFS1(G,s)
if (DFS1(G,u) % 2==0)
result  <-- true


DFS1(G,u):
Discovered[u] <-- true
// counter ++            But where I should initialize it??
foreach Edge (v,u) incident to u
if !Discovered[v]
DFS1(G,v)`

2 个答案:

答案 0 :(得分:2)

您可以在DFS1内声明计数器,如下所示:

DFS1(G,u):
    Discovered[u] = true
    int counter = 1                     // Count actual node           
    foreach Edge (v,u) incident to u
        if !Discovered[v]
            counter += DFS1(G,v)        // Count descendant nodes
    return counter

或者在全局范围内声明计数器,并在每次DFS1调用时将其递增:

int counter = 0

DFS(G,s):
    boolean result = false
    Discovered[v] = false for all Vertices V(v)
    DFS1(G,s)
    if (counter % 2 == 0)
        result = true

DFS1(G,u):
    Discovered[u] = true
    counter++
    foreach Edge (v,u) incident to u
        if !Discovered[v]
            DFS1(G,v)

答案 1 :(得分:0)

每当您将Discovered[u]设置为True且尚未True时,您就会找到一个新的连接顶点,并且应该增加您的计数器。

由于DFS1永远不会返回任何内容,因此我不确定检查它返回的内容会有多大帮助,特别是因为在使用该范围内不知道的变量调用它之后进行检查。