c语言中具有邻接矩阵的DFS
我正在尝试编写一个带有邻接矩阵和堆栈的DFS代码。除了最后的一个值,我不知道它是从哪里来的,输出是正常的c语言中具有邻接矩阵的DFS,c,depth-first-search,C,Depth First Search,我正在尝试编写一个带有邻接矩阵和堆栈的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; v
#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);
}
#包括
#包括
int a[100][100],i,j,n;
无效dfs(整数根)
{
int-vis[10],v,s[10],c,top=-1;
对于(i=0;i=0){
int v=s[顶部];
c=0;
对于(i=0;i
有人能告诉我出了什么事吗
我试过用c语言调试它,但还是说不出来。它看起来不像是一个尽可能探索每个分支的DFS算法,但如果您注意到不使用s[top]=I擦除访问的节点,它可能适用于无向图。
据我所知,您应该探索每个已访问节点的分支,然后处理其他节点。您提供的示例实现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;
}
您还应该使
vis
和s
更大,因为您的邻接矩阵最多可以容纳100个节点,而这些数组只有10个。输入是什么?预期产量是多少?输出是什么,最后的值是什么?你能把你的代码格式化成更可读的吗?你能用更多的信息名称而不是i,j,c,vis,n,top吗?If将使代码更可读。for(i=0;i引用:int-vis[10],v,s[10],c,top=-1;for(i=0;i
如果n
中的值不是10,则此代码将不会完全初始化数组vis[]
或将设置超出数组末尾的值。强烈建议使用\define
而不是10
,并限制初始化为\define MAX\u array\u SIZE 10
和的项目数(i=0;i
对于发布的codeOT中的其他语句也存在类似的考虑:调用任何scanf()
函数族时,始终检查返回值(而不是参数值)以确保操作成功。看起来像BFS,DFS通常是递归生成的。
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;
}
}