图的遍历

感觉自己好久不做这类题,脑子都有点抽了!

这里放一道很有意思的题:

链接戳这里☞

一笔画问题

下面是代码和详细注释:有兴趣的可以看一下!

    #include<cstdio>
    #include<cstring>
    #include<cstdlib>
    using namespace std;
    bool mp[1505][1505];//存边 
    int m,n,step[1505],num[1505],right;//分别是n:点个数;m:边个数;step:步数; num:记录存边时每一个点的已存边数; 
    //right:记录起始偶点; 
    bool judge();//判定奇偶点个数函数 
    void dfs(int v,int st,int begin)//对边进行深度搜索 v:当前点位置;st:步数;begin:起点 
    {
        if(st==m)// 如果步数和边数一样了! 输出答案! 
        {
            printf("%d",begin);
            for(int i=0;i<st;++i)
            {
                printf(" %d",step[i]);
            }
            exit(0);//退出程序,在cstdlib中 
        }
        for(int i=1;i<=n;++i)
        {
            if(mp[v][i])//若有边没有被走过 
            {
                mp[v][i]=false;//走过这条边 
                mp[i][v]=false;//同上 
                step[st]=i;//进行标记走过的点 
                dfs(i,st+1,begin);
                mp[v][i]=true;//如果退回,则取消标记走过这条边 
                mp[i][v]=true;//同上 
            }
        }
    }
    int main()
    {
        scanf("%d%d",&n,&m);//n point m line
        int a,b;
        for(int i=1;i<=m;++i)//读入 
        {
            scanf("%d%d",&a,&b);
            mp[a][b]=true; 
            num[a]++;//☣
            mp[b][a]=true;
            num[b]++;
        }
        if(judge())
        {
            dfs(right,0,right);
        }
        else
        dfs(1,0,1);//若没有奇点,则直接从1点开始遍历! 
    }
    bool judge()//判断有无奇偶点,进行起点选择! 
    {
        int left=0;
        for(int i=1;i<=n;++i)
        {
            if(num[i]%2==1)
            {
                right=i;
                left++;
            }
        }
        if(left==2)
        return true;
        else
        return false;
}
posted @ 2020-07-17 11:34  Mudrobot  阅读(199)  评论(0编辑  收藏  举报