c - 如何结束DFS的迭代

标签 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

最佳答案

首先,我强烈建议您从 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 还没有被标记为已访问,那么你只访问它。

关于c - 如何结束DFS的迭代,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21003044/

相关文章:

c - 数据结构、指针

c - 堆C数据存储

在扫雷器中搜索空单元格的算法

r - 将igraph的社区检测与neo4j集成

c - Valgrind 报告

c - GCC 4 的结构初始化失败

algorithm - 如何在方形网格上创建分支静脉/河流结构

java - 计算迭代算法的时间复杂度

graph - Dijkstra 算法 : why do I end up stuck in this example?

postgresql - 递归 CTE - 获取后代(多对多关系)