http://acm.hdu.edu.cn/showproblem.php?pid=1272
#include<iostream> #define MAX 100005 using namespace std; int fa[MAX],flag,sign[MAX]; int find(int x) { return(fa[x]==x?x:find(fa[x])); } void merge(int x,int y) { x=find(x); y=find(y); if(x!=y) fa[x]=y; else flag=0; } int main(void) { int i,a,b,k; while(cin>>a>>b) { if(a==-1&&b==-1) break; if(a==0&&b==0) { cout<<"Yes"<<endl; continue; } for(i=1;i<MAX;i++) { fa[i]=i; sign[i]=0; } sign[a]=sign[b]=1; flag=1; merge(a,b); while(cin>>a>>b) { if(a==0&&b==0) break; merge(a,b); sign[a]=sign[b]=1; } k=0; for(i=1;i<MAX;i++) { if(sign[i]&&fa[i]==i) k++; if(k>1) flag=0; } if(flag) cout<<"Yes"<<endl; else cout<<"No"<<endl; } return 0; }