九度 oj 题目1481:Is It A Tree?

62 篇文章 0 订阅
9 篇文章 0 订阅

http://ac.jobdu.com/problem.php?pid=1481


最开始的版本

只考虑到了,每个节点至多有一个父节点(至多有一个入度),最多有一个根。而忽略了有环,可空树的情况。

参考了 

1.http://www.cnblogs.com/newpanderking/archive/2012/10/14/2723260.html

*使用并查集来解决 唯一根,存在环,空树的情况

*使用degree[] 来解决唯一父节点


#include <stdio.h>
#include <cstring>

static int father[10005];
static int degree[10005];
static int visit[10005];

int find(int u){ 
    return u == father[u]? u : father[u] = find(father[u]); 
}  

int main(){ 
    //freopen("in/1481.in","r",stdin); 
    int a,b,Case=1;
    bool isTree = true;
    for (int i = 0; i < 10005; ++i) { 
        father[i] = i; 
        degree[i] = 0;
        visit[i] = false;
    }  

    while(scanf("%d%d",&a,&b) && !(a==-1 && b ==-1) ) { 
        if (a==0 && b==0) { 

            int nRoot = 0;
            for (int i = 1; i < 10005; ++i) { 
                if(father[i] == i&& visit[i]) nRoot++; 
                if(degree[i] > 1){ 
                   isTree = false; 
                   break;
                }   
            } 
            if(nRoot > 1) isTree = false;  

            if(isTree) printf("Case %d is a tree.\n",Case++); 
            else printf("Case %d is not a tree.\n",Case++); 
            for (int i = 0; i < 10005; ++i) { 
                father[i] = i; 
                degree[i] = 0;
                visit[i] = false;
            }  
            isTree = true;
            continue;
        }  
        degree[b]++;
        visit[a] = visit[b] = true;
        if(find(a) != find(b)) father[find(b)] = find(a);
        else{ 
            //There is a loop
            isTree = false; 
        } 
    }  
}  


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值