测试数据
1: 0 0 空树是一棵树
2: 1 1 0 0 不是树 不能自己指向自己
3: 1 2 1 2 0 0 不是树....自己开始一直在这么WA 好郁闷 重复都不行呀~~5555
4: 1 2 2 3 4 5 不是树 森林不算是树(主要是注意自己)
5: 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8 9 9 1 注意 一个节点在指向自己的父亲或祖先 都是错误的 即 9-->1 错
6: 1 2 2 1 0 0 也是错误的
1: 0 0 空树是一棵树
2: 1 1 0 0 不是树 不能自己指向自己
3: 1 2 1 2 0 0 不是树....自己开始一直在这么WA 好郁闷 重复都不行呀~~5555
4: 1 2 2 3 4 5 不是树 森林不算是树(主要是注意自己)
5: 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8 9 9 1 注意 一个节点在指向自己的父亲或祖先 都是错误的 即 9-->1 错
6: 1 2 2 1 0 0 也是错误的
#include<stdio.h>
#include<algorithm>
using namespace std;
#define MAXN 11000
int pre[MAXN],vis[MAXN],flag,maxn;
void init(){
for(int i=1;i<MAXN;i++){
pre[i]=i;
vis[i]=0;
}
flag=0;
maxn=0;
}
int find(int x){
return x==pre[x]?x:pre[x]=find(pre[x]);
}
void merge(int a,int b){
int xx=find(a);
int yy=find(b);
//b!=yy,说明其已经有了一个父节点,
//xx==yy,说明u的根节点指向它自己 不符合要求
if(xx==yy||b!=yy)flag=1;
if(xx!=yy){
pre[yy]=xx;
}
}
int main(){
int n,m;
init();
int KASE=1;
while(scanf("%d%d",&n,&m)!=EOF){
if(n==-1&&m==-1)
break;
if(n==0&&m==0){
int num=0;
for(int i=1;i<=maxn;i++){
if(vis[i]&&pre[i]==i)
num++;
}
if(num>=2||flag==1){
printf("Case %d is not a tree.\n",KASE++);
// printf("num=%d flag=%d\n",num,flag);
}
else printf("Case %d is a tree.\n",KASE++);
init();
continue;
}
maxn=max(maxn,max(n,m));
vis[n]=vis[m]=1;
merge(n,m);
}
return 0;
}