NYOJ 129判定树

 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;
}


 

posted @ 2013-04-04 20:07  YaLing  阅读(282)  评论(0编辑  收藏  举报