Description
给出一个无向图,是否存在一条路径能够经过所有边恰好一次,并且经过所有点?不需要满足最后回到起点。
Input
第一行一个数 ,表示有T组数据。对与每组数据,第一行有两个数n,m ,接下去n行每行两个数u, v描述一条无向边(u, v)。图不保证联通。
Output
对于每组数据,如果存在,输出 "Yes", 否则 "No"。
Hint
1 <= T <= 200
2 <= n <= 30
1 <= m <= n(n-1)/2
#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
int p[205];
int Find(int x) {
return x==p[x]?x:p[x]=Find(p[x]);
}
int main() {
int n,m,i,j,k,t,a,b,cnt;
cin>>t;
while(t--) {
cin>>n>>m;
cnt=0; //存放联通的边
int degree[205]= {0}; //每个点的度
for(i=1; i<=n; i++) p[i]=i;
for(i=1; i<=m; i++) {
cin>>a>>b;
degree[a]++;
degree[b]++;
int x=Find(a);
int y=Find(b);
if(x!=y) {
cnt++;
p[x]=y;
}
}
k=0;
for(i=1; i<=n; i++)
if(degree[i]%2==1) k++;//不成环 奇数度的点只有两个 成环一个都没有
if((k==2||k==0)&&cnt==n-1) cout<<"Yes\n";
else cout<<"No\n";
}
return 0;
}