Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
c语言中具有邻接矩阵的DFS_C_Depth First Search - Fatal编程技术网

c语言中具有邻接矩阵的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

我正在尝试编写一个带有邻接矩阵和堆栈的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);
}
#包括
#包括
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;
        }
}