利用并查集
#include<bits/stdc++.h>
#define PI 3.1415926
using namespace std;
const int maxn = 1003;
int P,Q; ///P为顶点数,Q为边数
int degree[maxn]; ///存放每个节点的度数
int father[maxn]; ///进行并查集操作的数组
void make_set()
{
for(int i = 1; i <= P; i++)
{
father[i] = i;
}
}
int find_set(int x)
{
return father[x]==-1?x:father[x]=find_set(father[x]);
}
void union_set(int x,int y)
{
father[x] = y;
}
bool IsConnection() ///判图是否连通
{
int num = 0;
for(int i = 1; i <= P; i++)
{
if(father[i]==-1) ///自己所属集合是自己点只能有一个
num++;
}
if(num == 1) return true;
else return false;
}
int main()
{
int N,A,B;
cin>>N;
while(N--)
{
memset(father,-1,sizeof(father));
cin>>P>>Q;
memset(degree,0,sizeof(degree));
//make_set(); ///初始化并查集
for(int i = 0; i < Q; i++)
{
scanf("%d%d",&A,&B);
degree[A]++;
degree[B]++;
int fa = find_set(A);
int fb = find_set(B);
if(fa!=fb)
union_set(fa,fb);
}
int num = 0;
for(int i = 1; i <= P; i++)
{
if(degree[i]%2) ///统计奇度节点的个数
num++;
}
///如果奇度节点的个数是0个或2个,且图是连通的则存在欧拉通路
if((num==0||num==2)&&IsConnection())
cout<<"Yes"<<endl;
else
cout<<"No"<<endl;
}
//欧拉通路:图连通;图中只有2个度为奇数的节点(就是欧拉通路的2个端点)
//欧拉回路:图连通;图中所有节点度均为偶数
return 0;
}