标签:
Description
Input
Output
Sample Input
6 8 5 3 5 2 6 4 5 6 0 0 8 1 7 3 6 2 8 9 7 5 7 4 7 8 7 6 0 0 3 8 6 8 6 4 5 3 5 6 5 2 0 0 -1 -1
Sample Output
Case 1 is a tree. Case 2 is a tree. Case 3 is not a tree.
#include <cstdio> #include <cstring> const int MAX=100010; int pa[MAX],vis[MAX],x2,y2,i,root=0; bool flag=1; int cha(int k) { if(pa[k]!=k) { pa[k]=cha(pa[k]); } return pa[k]; } bool bing(int x,int y) { int x2=cha(x); int y2=cha(y); if((x2==y2&&x!=y)||x==y)//一旦找到根相同 则之前在其他路就已经出现过,已经绕成了环 {//自身指向自身不是一课数; flag=0; return false; } pa[y2]=x2; vis[x]=1;//用于标记它已经出现过 vis[y]=1; return true; } void init() { for(i=1; i<=MAX; i++) { pa[i]=i; vis[i]=0; } } int main() { init(); int i,j,x,y,m,n,count=0; while(scanf("%d%d",&m,&n)!=EOF) { if(m==-1&&n==-1) break; if(m==0&&n==0) { root=0; for(i=1; i<MAX; i++) { if(cha(i)==i&&vis[i])//查找根的个数 root++; } if(root>1)//如果根大于了1 则是森林 不是一棵树 flag=0; count++; if(flag==1) printf("Case %d is a tree.\n",count); else { printf("Case %d is not a tree.\n",count); } init();//重新输入下一个Case时 初始化数据 flag=1; continue; } bing(m,n); } return 0; }
标签:
原文地址:http://www.cnblogs.com/tianmin123/p/4620199.html