Is It A Tree?(hdu132并查集)

来源:互联网 发布:java中图片上传 编辑:程序博客网 时间:2024/05/22 03:32

题意:给你一些点的关系,判断他们能否组成一棵树

组成树的条件

1.根节点只有一个。

2.不能有环。

在合并的时候判断环,合并完成后,遍历每个节点看其父亲是否相同,都相同说明只有一个节点,否则不是树。

#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>using namespace std;int father[100000];int f[100000];int ff[100000];int flag = 0;void Make_set(int n){    int i;    for(i = 0; i < n; i++)    {        father[i] = i;    }}int Find_set(int x){    if(x != father[x])    {        father[x] = Find_set(father[x]);    }    return father[x];}void Union(int a,int b){    int x = Find_set(a);    int y = Find_set(b);    if(x == y)    {        flag = 1;        return ;    }    else    {        father[y] = x;    }}int main(){    int a,b,cas = 1;    while(scanf("%d%d",&a,&b) != EOF)    {        Make_set(100000);        if(a < 0 && b < 0)        {            break;        }        else        {                        flag = 0;            Union(a,b);ff[a] = 1,ff[b] = 1;            int i;            int sum = 1;            while(scanf("%d%d",&a,&b) != EOF)            {                if(a == 0 && b == 0)                    break;                ff[a] = 1,ff[b] = 1;                Union(a,b);sum++;            }            memset(f,0,sizeof(f));            printf("Case %d ",cas++);            if(flag)            {                printf("is not a tree.\n");            }            else            {                int i,count = 0;                for(i = 0; i < 100000; i++)                {                    if( ff[i] && !f[Find_set(i)])                    {                        f[Find_set(i)] = 1;                        count++;                    }                    if(count == sum )                        break;                }                if(count > 1)                    printf("is not a tree.\n");                else                    printf("is a tree.\n");            }        }    }    return 0;}


原创粉丝点击