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