HDOJ 1308.Is It A Tree?

来源:互联网 发布:加入淘宝30元消保要求 编辑:程序博客网 时间:2024/05/08 16:11
2015-07-15

问题简述:

  给出一组节点关系,判断由这些节点组成的图是否为一颗树。

  树只有一个根节点,每个节点只有一条边指向它,没有环。

  原题链接:http://poj.org/problem?id=1308

解题思路:

  使用并查集判断是否只有一个根节点是很简单的——让并查集种祖先的父亲是他自己即可方便计算其数量,一旦祖先数量超过一,它就不是树;

  也可使用并查集判断图是否有环——当两个即将要链接的节点都有相同的祖先时,这就产生了一个环。

源代码:

/*OJ: POJID: foreverTASK: 1308.Is It A Tree?LANG: C++NOTE: Find-Union*/#include <cstdio>const int MAX=10005;int father[MAX],sign[MAX],flag;int Find(int x) {    if(father[x]==x)        return x;    else        return Find(father[x]);}void Union(int x,int y) {    x=Find(x);    y=Find(y);    if(x!=y)        father[x]=y;    else        flag=0;}int main(){    int a,b,k=1;    while(scanf("%d %d",&a,&b)) {        if(a==-1&&b==-1) break;        if(a==0&&b==0) {            printf("Case %d is a tree.\n",k++);            continue;        }        flag=1;        int m=0;        for(int i=0;i<MAX;i++) {            father[i]=i;            sign[i]=0;        }        Union(a,b);        sign[a]=sign[b]=1;        while(scanf("%d %d",&a,&b)) {            if(a==0&&b==0) break;            if(a>m)                m=a;            if(b>m)                m=b;            Union(a,b);            sign[a]=sign[b]=1;        }        int sum=0;        for(int i=1;i<MAX;i++) {            if(sign[i]&&father[i]==i)                sum++;            if(sum>1) {                flag=0;                break;            }        }        if(flag)            printf("Case %d is a tree.\n",k++);        else            printf("Case %d is not a tree.\n",k++);    }    return 0;}


0 0
原创粉丝点击