并查集,是否成树,Poj(1308)

思路:

对于每一条新的边的两个端点,是否是属于一颗树,要是的话,就不是一颗树。否则,就合并。

这里要注意的是,不能是森林,我这里WA了两次了。只不过在最后,查看每个节点的祖先是否是同一个就可以了。

#include <stdio.h>
#include <string.h>
#include <algorithm>

using namespace std;

const int maxn = 105;

int father[maxn];
bool vis[maxn];

int Find_set(int x)
{
    if(x!=father[x])
        father[x]=Find_set(father[x]);
    return father[x];
}

void Union(int x,int y)
{
    father[y] = x;
}

int main()
{
    bool flag;
    int x,y;
    int t=0;
    while(scanf("%d%d",&x,&y),x!=-1)
    {
        flag=true;
        if(x==0&&y==0)
        {
            printf("Case %d is a tree.\n",++t);
            continue;
        }

        else {
            for(int i=0;i<maxn;i++)
            {
                father[i] = i;
                vis[i] = false;
            }

            int first = x;
            vis[x]=vis[y]=true;
            if(Find_set(x)==Find_set(y))
                flag=false;
            else Union(x,y);

            while(scanf("%d%d",&x,&y),x!=0)
            {
                vis[x]=vis[y]=true;
                int fx=Find_set(x);
                int fy=Find_set(y);
                if(fx==fy)
                    flag=false;
                else Union(fx,fy);
            }
            for(int i=0;i<maxn;i++)
            {
                if(vis[i]&&Find_set(first)!=Find_set(i))
                {
                    flag=false;
                    break;
                }
            }
            if(flag)
                printf("Case %d is a tree.\n",++t);
            else printf("Case %d is not a tree.\n",++t);

        }


    }
    return 0;
}

 

转载于:https://www.cnblogs.com/TreeDream/p/5608956.html

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值