#include <iostream> #include <map> using namespace std; int pre[10005]; bool flag; map<int,int> mm; map<int,int>::iterator it; void Union(int &start,int &end) { pre[end]=start; } int Find(int x) { if(pre[x]!=0) return Find(pre[x]); return x; } int main() { int start,end,num=1,root1,root2,tmp; while(cin>>start>>end) { mm.clear(); flag=true; if(start == -1 && end == -1) break; if( (start==0&&end==0) ) //判断空树是一颗树 { cout<<"Case "<<num++<<" is a tree."<<endl; continue; } if(start==end) flag=false; //若第一个结点指向自身,则不是一颗树 memset(pre,0,sizeof(pre)); mm[start]=start; mm[end]=end; Union(start,end); while(cin>>start>>end) { if(!start&&!end) break; mm[start]=start; mm[end]=end; root1=Find(start) ; root2=Find(end) ; if(root2!=end||root1==root2) flag=false; //若end结点的前驱不是自身则已存在一条路径指向end再添加则该结点入度大于1,若两结点的根相同,将他们连接会构成环,不是一颗树 if(!flag) continue; //若已判定不是数则不必浪费时间继续操作 else { Union(start,end); } } if(flag) //判断是否所有的结点都已经连通,森林不是树 { it=mm.begin(); tmp=Find(it->second); for(it=mm.begin();it!=mm.end();++it) { root1=Find(it->second); if(root1!=tmp) { flag=false; break; } } } if(!flag) cout<<"Case "<<num++<<" is not a tree."<<endl; else cout<<"Case "<<num++<<" is a tree."<<endl; } return 0; }