zoukankan      html  css  js  c++  java
  • 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;
    }


  • 相关阅读:
    jQuery
    MySQL的引入,绿色包下载和应用
    jsp引用JSTL核心标签库
    Servlet的引入
    Servlet访问Javabean并传结果给jsp
    Spring MVC 中获取session的几种方法
    面试必问系列——hashmap的默认扩容阈值是大于12还是大于等于12
    面试必问系列——重写equals为什么一定要重写hashcode
    分析spring4和spring5日志中的不同
    mysql 查询参数尾部有空格时被忽略
  • 原文地址:https://www.cnblogs.com/yaling/p/2999758.html
Copyright © 2011-2022 走看看