我正在尝试编写具有邻接矩阵和堆栈的DFS代码。输出是可以的,除了最后一个值,我不知道它来自哪里。
#include <stdio.h>
#include <stdlib.h>
int a[100][100], i, j, n;
void dfs(int root)
{
int vis[10], v, s[10], c, top = -1;
for (i = 0; i < n; i++)
vis[i] = 0;
vis[root] = 1;
top++;
s[top] = root;
while (top >= 0) {
int v = s[top];
c = 0;
for (i = 0; i < n; i++)
if (a[v][i] == 1 && vis[i] == 0) {
top++;
s[top] = i;
vis[i] = 1;
c = 1;
}
if (c == 0)
top = top - 1;
}
for (i = 0; i < n; i++)
printf("%d", s[i]);
}
int main()
{
int root;
printf("numarul de noduri:");
scanf("%d", &n);
printf("root node:");
scanf("%d", &root);
for (i = 0; i < n; i++)
for (j = 0; j < n; j++)
scanf("%d", &a[i][j]);
dfs(root);
}
有人可以暗示出什么问题吗?
我尝试在c失败中进行调试仍然无法分辨。
答案 0 :(得分:1)
您提供的示例实现了BFS,而不是DFS。您的代码的问题是堆栈处理。特别是,在尝试重用堆栈顶部时,您不会擦除访问的节点。而且,这使解决方案变得更加复杂。
if (a[v][i] == 1 && vis[i] == 0) {
top++; // <-- problem: you step over the current node
s[top] = i; // so it's not overwritten here
vis[i] = 1;
c = 1;
}
我建议您将top
用作下一个空插槽的索引,而不是最后写入的索引。这样可以简化代码,如下所示:
s[top++] = root;
while (top > 0) {
int v = s[--top];
for (i = 0; i < n; i++)
if (a[v][i] == 1 && vis[i] == 0) {
s[top++] = i;
vis[i] = 1;
}
}
您还应该增大vis
和s
,因为邻接矩阵最多可以容纳100个节点,而这些数组只能容纳10个。
答案 1 :(得分:-1)
它看起来不像是DFS算法,它会尽可能地探索每个分支https://en.wikipedia.org/wiki/Depth-first_search,但是如果您不使用 s [top] =我。 据我所知,您应该探索每个访问的节点的分支,然后再照顾其他节点。