hdu 1325 Is It A Tree?(并查集)

题意:给出点、边,判断是不是一棵树

思路:问题是如何判断是不是树?

我总结了一下,但不官方,正确性待验证。

1.入度<=1(根节点为0,其他为1)

2.不能有环

3.只有一个根节点

#include<iostream>
#include<stdio.h>
#include<string.h>
using namespace std;

#define MAXN 50000

int fa[MAXN];
int a[MAXN];
int in[MAXN];

int set_find(int d){
    if(fa[d]<0)return d;
    return fa[d]=set_find(fa[d]);
}

void set_join(int x,int y){
    x=set_find(x);
    y=set_find(y);
    if(x!=y)fa[x]=y;
}

int main(){
    int x,y,m=0,sum,i,tc=0;
    bool flag=true;
    memset(fa,-1,sizeof(fa));
    memset(in,0,sizeof(in));

    while(~scanf("%d%d",&x,&y)){
        if(x==-1&&y==-1)break;
        if(x==0&&y==0){
            if(flag==false)printf("Case %d is not a tree.\n",++tc);
            else{
                sum=0;
                for(i=0;i<m;++i)//条件3:只有一个根节点
                    if(fa[a[i]]==-1)++sum;
                if(sum==1)printf("Case %d is a tree.\n",++tc);
                else printf("Case %d is not a tree.\n",++tc);
            }
            m=0;
            flag=true;
            memset(fa,-1,sizeof(fa));
            memset(in,0,sizeof(in));
            continue;
        }
        a[m++]=x;
        a[m++]=y;
        if(in[y]==1)flag=false;//条件1:入度小于等于1
        if(set_find(x)==set_find(y))flag=false;//条件2:不能有环
        else {
            set_join(x,y);
            ++in[y];
        }
    }
    return 0;
}
View Code

 

posted @ 2015-08-14 19:19  gongpixin  阅读(199)  评论(0编辑  收藏  举报