Hrbust1658一笔画

一笔画
Time Limit: 1000 MSMemory Limit: 32768 K
Total Submit: 70(26 users)Total Accepted: 24(22 users)Rating: Special Judge: No
Description
判断一个图是否能够用一笔画下来.规定,所有的边都只能画一次,不能重复画。
Input
第一行只有一个正整数N(N<=10)表示测试数据的组数。
每组测试数据的第一行有两个正整数P,Q(P<=100,Q<=100),分别表示这个画中有多少个顶点和多少条连线。(点的编号从1到P)
随后的Q行,每行有两个正整数A,B(0<A,B<P),表示编号为A和B的两点之间有连线。
Output
如果存在符合条件的连线,则输出"Yes",
如果不存在符合条件的连线,输出"No"。
Sample Input

2

4 3

1 2

1 3

1 4

4 5

1 2

2 3

1 3

1 4

3 4

Sample Output

No

Yes

很裸的欧拉图问题 ,题解在代码中

#include <cstdio>
#include <iostream>
#include <cstring>
#include <string>
#include <cmath>
#include <queue>
#include <set>
#include <vector>
#include <stack>
#include <algorithm>
#define max(a,b) ((a)>(b)?(a):(b))
#define min(a,b) ((a)<(b)?(a):(b))
#define mem(a) memset(a, 0, sizeof(a))
#define eps 1e-5
#define M 100005
#define INF 0x3f3f3f3f
using namespace std;
//无向的欧拉图或者半欧拉图。 欧拉图:所有点的度为偶数。半欧拉图,起点和终点的度为奇数。
int a,b,aa,bb;
int f[M];
int pre[M];
int find(int x)
{
    int r=x;
    while(r!=pre[r])
    {
        r=pre[r];
    }
    return r;
}
int mx(int x,int y)
{
    int xx=find(x);
    int yy=find(y);
    if(xx!=yy)
    {
        pre[xx]=yy;
    }
}
int main()
{
    int t;
    cin>>t;
    while(t--)
    {
        mem(f);
        mem(pre);
     cin>>a>>b;
       for(int i=1;i<=a;i++)
       {
           pre[i]=i;
       }
        for(int i=0;i<b;i++)
        {
            cin>>aa>>bb;
            f[aa]++;
            f[bb]++;
            mx(aa,bb);
        }
        int flag=0;
        for(int i=1;i<=a;i++)
        {
            if(pre[i]==i)
            {
                flag++;
            }
        }
        if(flag!=1)//前提:图连通
            cout<<"No"<<endl;
        else
        {
            int sum=0;
            for(int i=1;i<=a;i++)
            {
                if(f[i]%2==1)
                {
                    sum++;
                }
            }
            if(sum==0||sum==2)
            {
                cout<<"Yes"<<endl;
            }
            else
                cout<<"No"<<endl;
    }
}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值