题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1272
刚开始没有考虑到这一棵树有没有合并,导致wa了。
1 #include<cstdio> 2 #include<cstring> 3 using namespace std; 4 const int maxn=100006; 5 int fa[maxn]; 6 bool book[maxn]; 7 8 void init() 9 { 10 for(int i=0;i<maxn;i++){ 11 fa[i]=i; 12 book[i]=0; 13 } 14 } 15 16 int find_fa(int x) 17 { 18 return fa[x]==x?x:fa[x]=find_fa(fa[x]); 19 } 20 21 int main() 22 { 23 int n,m,flag=1,top,head; 24 init(); 25 top=0; head=maxn; 26 while( ~scanf("%d%d",&n,&m)){ 27 int num=0; 28 29 if(n==-1&&m==-1) break; 30 if(n==0&&m==0){ 31 for(int i=head;i<=top;i++){ 32 if(fa[i]==i&&book[i]) 33 num++; 34 if(num>1){ 35 flag=0; 36 break; 37 } 38 } 39 if(flag) printf("Yes "); 40 else printf("No "); 41 flag=1; init(); 42 top=0; head=maxn; 43 continue; 44 } 45 if(top<n) top=n; 46 if(top<m) top=m; 47 if(head>n) head=n; 48 if(head>m) head=m; 49 int opn=find_fa(n); 50 int opm=find_fa(m); 51 book[n]=book[m]=true; 52 if(opn!=opm) fa[opn]=opm; 53 else flag=0; 54 } 55 return 0; 56 }