判断一笔画。
思路:一笔画问题就是,判断欧拉路径,所以是欧拉路径的话需要满足两个条件。1)图是联通的。2)在图中的顶点度数为奇数的顶点数为2或者0。判断连通图的话必然是并查集,顶点的度数跑一边就可以 判断出来。
#include<iostream>
#include<stdlib.h>
#include<time.h>
#include<string.h>
#include<cmath>
#include<cstdio>
#define inf 0x3f3f3f3f
#define ll __int64
int f[2010],du[2010],edg[2010];
using namespace std;
int fi(int x)
{
return x==f[x]?x:f[x]=fi(f[x]);
}
void mer(int a,int b)
{
int x=fi(a);
int y=fi(b);
if(x>y)
f[x]=y;
else
f[y]=x;
}
int main()
{
int n,m,i,j,k;
int cla;
scanf("%d",&cla);
while(cla--)
{
scanf("%d%d",&n,&m);
for(i=1;i<=n;i++)
f[i]=i;
int a,b;
memset(du,0,sizeof(du));
while(m--)
{
scanf("%d%d",&a,&b);
//memset(du,0,sizeof(du));
mer(a,b);
du[a]++;
du[b]++;
}
bool vis=false;
int tmp=0,s=0;
for(i=1;i<=n;i++)
{
if(f[i]==i)
tmp++;
if(tmp>1)
{
vis=true;
break;
}
if(du[i]%2!=0)
s++;
}
if(vis)
{
printf("No\n");
continue;
}
if(s==0||s==2)
printf("Yes\n");
else
printf("No\n");
}
return 0;
}