如何结束DFS的迭代

时间:2014-01-08 17:56:30

标签: c algorithm graph depth-first-search

我正在尝试在C中的图形上实现DFS但是当我到达没有更多未访问的成员可用的节点时,我正在努力回溯。 我已经尝试了所有可能的解决方案,我只能想到,但没有任何成功。 在此先感谢您的帮助。

void dfs_iter(int** graph, int* marks, int gsize, int i, NODE** stck)
{
    push_stack(st, i);
    marks[i] = 1;
    printf("%d ", i);

    while (!test_stack(*stck)) {
        int current = data_stack(*stck);
        int k;
        for (k = 0; k < gsize; k++) {
        if ((graph[current][k] == 1)) {
            if (marks[k] == 0) {
                push_stack(stck, k);
                marks[k] = 1;
                printf("%d ", k);
                break;
            } else {
                int l, is_route = 0;
                for (l = k; l < gsize; l++) {
                    if (graph[current][l] == 1 && !marks[l]) {
                        is_route = 1;
                    }
                }
                if (!test_stack(*st) && !is_route)
                    pull_stack(st);
                }
            }
        }
    }
}

这是我正在尝试进行DFS的图表:

0 1 0 0 0
0 0 0 0 1
0 0 0 1 0
0 1 0 0 0
1 0 1 0 0

2 个答案:

答案 0 :(得分:1)

首先,我强烈建议您从DFS的典型实现开始,这是递归的。

1  procedure DFS(G,v):
2      label v as discovered
3      for all edges from v to w in G.adjacentEdges(v) do
4          if vertex w is not labeled as discovered then
5              recursively call DFS(G,w)

这有助于可视化DFS的实际工作方式。请注意,访问节点时首先要将其标记为已访问。要跟踪已访问/未访问的节点,您可以创建一个数组,其中图中的每个节点都可以有一个领域。如果该字段为0 - 则未访问该字段。如果1 - 它已被访问(当然这只是一种可能的实现)。然后请注意,您再也不会去访问过的节点(意味着如果您在节点X中,Y是X的邻居,那么如果Y被标记为已访问,则不再访问它,只需检查下一个邻居。)然后检查迭代算法伪代码:

1  procedure DFS-iterative(G,v):
2      let S be a stack
3      S.push(v)
4      while S is not empty
5            v ← S.pop() 
6            if v is not labeled as discovered:
7                label v as discovered
8                for all edges from v to w in G.adjacentEdges(v) do
9                    S.push(w)

此处相同:如果尚未标记为已访问,则只访问v。

答案 1 :(得分:0)

只需跟踪数组中的访问节点即可。然后,只要已经访问了堆栈中的新节点,就不执行任何操作并继续。