/* 人倒霉起来什么都悲催,今天竟然被题目水了
没看清题目在加上惯性思维,以为是输入都是-1时结尾
献用G++交,runtime,我开始开打数组,再C++交TLE,我开始开小数组
最后才发现原来输入是以小于0结尾的,*/
#include <stdio.h>
#include <string.h>
int f[1001],g[1001];
int find(int x) //并查集的查找,找到共同的父亲
{
if(f[x]!=x)
f[x]=find(f[x]);
return f[x];
}
int main()
{
int a,b,tt=1;
while(scanf("%d%d",&a,&b)!=EOF)
{
int i,flag=0,t=0;
if(a<0&&b<0) //!!!
break;
for(i=0;i<=1000;i++)
f[i]=i;
if(find(a)==find(b))
flag=1;
else
f[find(b)]=find(a);
while(scanf("%d%d",&a,&b))
{
if(a==0&&b==0)
break;
int aa,bb;
aa=find(a);
bb=find(b);
if(aa==bb||bb!=b) //成环就不是树,后面的是检查是否有两个父节点,。。
flag=1;
else
f[bb]=aa;
}
memset(g,0,sizeof(g));
for(i=1;i<=1000;i++) //保证只有一个根,不然就是森林了
if(f[i]!=i)
g[find(i)]++;
for(i=1;i<=1000;i++) //检查是否只有一个头结点就是了
if(g[i]>0)
t++;
if(t>1)
flag=1;
if(flag==1)
printf("Case %d is not a tree.\n",tt++);
else
printf("Case %d is a tree.\n",tt++);
}
return 0;
}