图的遍历(c语言) 程序没有访问完就结束了,可以帮我看看嘛?

#include<stdio.h>
int e[101][101],book[101],i,sum,j,n,m;
void dfs(int cur)         //cur是当前所在的顶点编号 
{
    printf("%d ",cur);
    sum++;               //没访问一个顶点,sum就加1 
    if(sum == n) return;  //所有的顶点都已经访问过则直接退出 
    for(i=1;i<=n;i++)
    {
        if(e[cur][i] == 1 && book[i] == 0)
        {
            book[i]=1;  //标记顶点i已经访问过了 
            dfs(i);
        }
    }
    return;
}

int  main()
{
    int a,b;
    scanf("%d %d",&n,&m);
    //初始化二维矩阵 
    for(i=1;i<=n;i++)      
        for(j=1;j<=n;j++)
            if(i == j) e[i][j]=0;
            else e[i][j]=99999999;
    //读入顶点之间的边 
    for(i=1;i<=m;i++)
    {
        scanf("%d %d",&a,&b);
        e[a][b]=1;
        e[b][a]=1;
    }    
    book[1]=1;
    dfs(1);
    return 0;
}

图片描述
图片描述

阅读 2.7k
3 个回答

终止判断条件错误 尽量是用for(int i=1;i<=n;i++)这样的语句初始化i,不要都使用全局变量

新手上路,请多包涵

sum没初始化

加个布尔类型flag数组,flag[i]为真,则表示这个点dfs走到过,在dfs函数第一句判断这个点走过没有(即flag值是否为真),走过就return

Update:之前没注意有book数组……但访问到book数组里点的时候sum的值也增加了,导致sum提前到了N,导致现在这样……所以如果dfs的是一个book了的点就不要sum++了

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进