G - Is It A Tree?(2017-01-16)

题目大意
给你几个点的连接情况,问你这些点能否连接成一棵树。
思路
连接成一棵树的条件有(1)不能有环(2)只有一个根节点,不然就是森林了。
那么我们其实只要用并查集依次把那些点连接起来,再通过连接两个点判断其是否有同一个根节点,如果有的话,那么就会形成环状回路,肯定不行。
在连接完成之后再去判断所有的结点中根节点的个数,如果个数不止一个,那就是森林了,就不是一棵树了,肯定也不行啦。
当然还有一点要注意空树也是树。
代码如下:

#include
#include

int pre[1005];
int find(int x)
{
    while(pre[x]!=x)
    {
        x=pre[x];
    }
    return x;
}
int mix(int x,int y)
{
    int fx=find(x),fy=find(y);
    if(fx!=fy)
    {
        pre[fy]=fx;
    }
}
int main()
{
    int cnt=1,a,b,flag;
    while(1)
    {
        flag=0;
        while(~scanf("%d%d",&a,&b)&&a&&b)
        {
            if(a==-1&&a==-1)return 0;
            if(pre[a]==0)pre[a]=a;
            if(pre[b]==0)pre[b]=b;
            if(find(a)==find(b))flag=1;
            if(flag!=1)
            {
                mix(a,b);
            }
        }
            int sum=0;
            for(int i=1;i<=1005;i++)
            {
                if(pre[i]==i) sum++;
                pre[i]=0;
            }
            if(sum>1||flag==1)printf("Case %d is not a tree.\n",cnt++);
            else printf("Case %d is a tree.\n",cnt++);
        
    }
    return 0;
}

你可能感兴趣的:(G - Is It A Tree?(2017-01-16))