判断图的连通性+一笔画问题(NYOJ 42 一笔画问题)

来源:互联网 发布:淘宝营销 编辑:程序博客网 时间:2024/04/28 15:45

我感觉判断图的连通性可以用BFS,也可以用DFS,但是感觉DFS快些(没试过BFS),所以只写了DFS。。

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<queue>
#include<time.h>
using namespace std;
int s[1100][1100],v[1100],c[1100];//s表示图的连线情况,v表示点是否可联通,c表示点的度
int ans,q,p,sum;
void dfs(int d)
{
    if(sum==p)
    {
        ans=1;
    }
    else
    {
        int i;
        for(i=1;i<=p;i++)
        {
            if(s[d][i]==0&&v[i]==0)
            {
                v[i]=1;
                sum++;
                dfs(i);
            }
        }
    }
}
int main()
{
    int t,i,j,a,b,ou,ji;
    cin>>t;
    while(t--)
    {
        cin>>p>>q;
        memset(s,-1,sizeof(s));
        memset(c,0,sizeof(c));
        for(i=0;i<q;i++)
        {
            scanf("%d%d",&a,&b);
            c[a]++;
            c[b]++;
            s[a][b]=0;
            s[b][a]=0;
        }
        ans=0;
        sum=1;
        memset(v,0,sizeof(v));
        v[1]=1;
        dfs(1);
        if(ans==0)
        {
            cout<<"No"<<endl;
        }
        else
        {
            ou=ji=0;//判断是否可以一笔画:点的度全是偶数或者奇数度的点只有两个就行,其他都不行(有偶数个奇点除以2可以算出需要几画)
            for(i=1;i<=p;i++)
            {
                if(c[i]%2==0)
                {
                    ou++;
                }
                else
                {
                    ji++;
                }
            }
            if(ji==0||ji==2)
            {
                cout<<"Yes"<<endl;
            }
            else
            {
                cout<<"No"<<endl;
            }
        }
    }
    return 0;
}

0 0