对于无向图G,具有一条欧拉路(一笔画),当且仅当G是连通的,且有零个或两个奇数度结点。
代码:
#include<bits/stdc++.h>
using namespace std;
int par[1001];
int G[1001];
void init(int n)
{
for(int i=1;i<=n;i++)
par[i]=i;
}
int find(int x)
{
if(x!=par[x])
par[x]=find(par[x]);
return par[x];
}
void union_(int x,int y)
{
x=find(x);
y=find(y);
if(x!=y)
par[y]=x;
}
int main()
{
int N,n,m;
scanf("%d",&N);
while(N--)
{
memset(G,0,sizeof(G));
scanf("%d%d",&n,&m);
init(n);
int a,b;
for(int i=1;i<=m;i++)
{
scanf("%d%d",&a,&b);
union_(a,b);
G[a]++;
G[b]++;
}
int sum_root=0,sum_ji=0;//根结点的个数,记录奇度顶点个数
for(int i=1;i<=n;i++)
{ if(par[i]==i) sum_root++;
if(G[i]&1) sum_ji++;
}
if(sum_root>1)
{
printf("No\n");
continue;
}
if(sum_ji==0||sum_ji==2)
printf("Yes\n");
else
printf("No\n");
}
return 0;
}