nyoj 42
#include <iostream> #include <stdio.h> #include <cstring> #include <algorithm> using namespace std; int f[1000]; int digree[1000]; int find(int x) { while(x!=f[x]) x=find(f[x]); return x; } void bing(int a,int b) { if(find(a)!=find(b)) f[find(a)]=find(b); } //并查集模板,不解释 int main() { int i,p,q; int n,a,b; scanf("%d",&n); while(n--) { memset(f,0,sizeof(f)); memset(digree,0,sizeof(digree)); //记得要初始化为0 scanf("%d%d",&p,&q); for(i=1;i<=p;i++) f[i]=i; // for(i=1;i<=p;i++) cout<<f[i]<<" "; for(i=1;i<=q;i++) { scanf("%d%d",&a,&b); if(a==b) continue; //解决重复 else { digree[a]++; digree[b]++; } bing(a,b); } int jidian=0,cnt=0; for(i=1;i<=p;i++) { if(i==f[i]) cnt++; if(digree[i]&1) jidian++; //判断基点个数 } if(cnt==1 && ( jidian==0 || jidian==2 ) ) printf("Yes\n"); else printf("No\n"); } return 0; }
// nyoj 42
//这一题主要是使用并查集加欧拉回路的概念,总体的思路是判定一个图是否连通,然后用欧拉定理判断基点个数来判断一个图是否能一笔画成。。。