并查集的简单应用。
注意:1、空树也是树;2、记得判断是否成了森林。
#include<iostream> #include<cstdio> using namespace std; int sta[1000],flag,pa[1000]; int find(int a) { int x=a; while(x!=pa[x]) x=pa[x]; return x; } void unio(int a,int b) { pa[b]=a; } int main() { int a,b,cas=1,i; while(1) { bool tree=true;flag=-1; for( i=0;i<1000;i++) pa[i]=i; cin>>a>>b; if(a==-1&&b==-1) break; if(a==0&&b==0){} else { int p=find(a),q=find(b); if(q==b&&p!=b) { unio(a,b); } else tree=false; for( i=0;i<=flag;i++) if(a==sta[i]) break; if(i==flag+1) { flag++;sta[flag]=a;} for(i=0;i<=flag;i++) if(b==sta[i]) break; if(i==flag+1) { flag++;sta[flag]=b;} } while(1) { if(a==0&&b==0) break; cin>>a>>b; if(a==0&&b==0) break; if(a==b) tree=false; if(tree) { int p=find(a),q=find(b); if(q==b&&p!=b) { unio(a,b); } else tree=false; for( i=0;i<=flag;i++) if(a==sta[i]) break; if(i==flag+1) { flag++;sta[flag]=a;} for(i=0;i<=flag;i++) if(b==sta[i]) break; if(i==flag+1) { flag++;sta[flag]=b;} } } if(tree) { if(flag!=-1) { int t=find(sta[0]); for(int i=1;i<=flag;i++) if(find(sta[i])!=t) { tree=false;break;} } } if(tree) printf("Case %d is a tree./n",cas); else printf("Case %d is not a tree./n",cas); cas++; } return 0; }
