C中具有邻接矩阵的DFS

时间:2018-08-17 09:27:20

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

    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失败中进行调试仍然无法分辨。

2 个答案:

答案 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;
        }
}

您还应该增大viss,因为邻接矩阵最多可以容纳100个节点,而这些数组只能容纳10个。

答案 1 :(得分:-1)

它看起来不像是DFS算法,它会尽可能地探索每个分支https://en.wikipedia.org/wiki/Depth-first_search,但是如果您不使用 s [top] =我。 据我所知,您应该探索每个访问的节点的分支,然后再照顾其他节点。