1 #include<iostream>
2 #include<cstring>
3 using namespace std;
4
5 #define N 10010
6 int parent[N],in[N];
7 bool visit[N];
8
9 int find(int x)
10 {
11 if(x == parent[x]) return x;
12 return find(parent[x]);
13 }
14
15 int max(int a,int b)
16 {
17 return a>b ? a:b;
18 }
19
20 int main()
21 {
22 // freopen("in.txt","r",stdin);
23 int i,k=1,a,b,maxn=0;
24 memset(visit,false,sizeof(visit));
25 memset(in,0,sizeof(in));
26 for(i=0; i<N; ++i) parent[i] = i;
27 int flag = 1;
28 while(cin>>a>>b)
29 {
30 if(a == -1 && b == -1) break;
31 if(a == 0 && b == 0)
32 {
33 int t=0;
34 for(i=0; i<=maxn; ++i)
35 {
36 if(visit[i] && i == parent[i])
37 t++;
38 }
39 if(t>1) flag = 0;
40 if(flag)
41 cout<<"Case "<<k++<<" is a tree.\n";
42 else
43 cout<<"Case "<<k++<<" is not a tree.\n";
44 memset(visit,false,sizeof(visit));
45 memset(in,0,sizeof(in));
46 for(i=0; i<N; ++i) parent[i] = i;
47 flag = 1;maxn=0;
48 }
49 else
50 {
51 maxn = max(maxn,max(a,b));
52 visit[a] = visit[b] = true;
53 in[b]++;
54 if(in[b]>1) flag = 0;
55 if(!flag) continue;
56 int x = find(a);
57 int y = find(b);
58 if(x != y)
59 parent[y] = x;
60 else
61 flag = 0;
62 }
63 }
64 return 0;
65 }
66
67 //总结:存储父亲结点,因为孩子结点只可能为1(即入度只能为1)。
//代码二:
#include <iostream>
using namespace std;
int node[10001];
bool visited[10001];
int find(int i){
if(i == node[i]) return i;
return find(node[i]);
}
int main()
{
int a, b, k = 1, i;
bool flag;
for(i = 0; i < 10001; ++i){ node[i] = i; visited[i] = false;}
flag = false;
while(cin>>a>>b){
if(a == -1 && b == -1) break;
if(a || b){
visited[a] = visited[b] = true;
if(flag) continue;
if(node[b] == b && find(a) != b){ //只有一个父亲结点且无环
node[b] = a;
}
else flag = true;
}
else{
int t = 0;
for(i = 0; i < 10001; ++i)
if(visited[i] && i == node[i])
++t; //根结点的个数是否只有一个?
if(t > 1) flag = true;
if(!flag) cout<<"Case "<<k++<<" is a tree.\n";
else cout<<"Case "<<k++<<" is not a tree.\n";
for(i = 0; i < 10001; ++i){node[i] = i; visited[i] = false;}
flag = false;
}
}
return 0;
}