我正在尝试在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
答案 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)
只需跟踪数组中的访问节点即可。然后,只要已经访问了堆栈中的新节点,就不执行任何操作并继续。