【题目分析】
并查集。
【代码】
#include <cstdio>
#include <cmath>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
int x,y,kase=0,now;
int f[201],used[201];
inline int gf(int k)
{
if (f[k]==k) return k;
else return f[k]=gf(f[k]);
}
int main()
{
while (scanf("%d%d",&x,&y)!=EOF)
{
if (x==-1||y==-1) return 0;
if (x==0&&y==0) {printf("Case %d is a tree.\n",++kase); continue;}
for (int i=1;i<=200;++i) f[i]=i,used[i]=0;
bool ans=true;
used[x]=used[y]=1;
now=x;
if (x==y) ans=false;
else{
int fx=gf(x),fy=gf(y);
if (fx!=fy) f[fx]=fy;
}
while (scanf("%d%d",&x,&y)!=EOF&&x&&y)
{
used[x]=used[y]=1;
int fx=gf(x),fy=gf(y);
if (fx==fy) ans=false;
else f[fx]=fy;
}
for (int i=1;i<=200;++i)
if (used[i]&&gf(i)!=gf(now)) ans=false;
if (ans) printf("Case %d is a tree.\n",++kase);
else printf("Case %d is not a tree.\n",++kase);
}
}