hdu1272(并查集无环且连通)

来源:互联网 发布:windows to go移动硬盘 编辑:程序博客网 时间:2024/05/17 07:38
解题思路:题目意思是找到判断是不是连通无环的图,首先想到的就是并查集。

              1》判断成环的时候,只要判断输入边的两个点。有一个共同的父节点,那么这两个点就成环。

              2》判断连通的时候,只要判断根节点数为1即可。

             注意:当输入的这组数据只有 0 0 时,依然是满足条件的,即应输出 "Yes"。


//

//  main.cpp

//  1232

//

//  Created by Mr.Xue on 17/8/8.

//  Copyright © 2017 Mr.Xue. All rights reserved.

//


#include <iostream>

#include <stdio.h>

using namespacestd;

int flag;

int pre[100005],vis[100005];

int find(int x)

{

    int r=x;

    while(pre[r]!=r)

        r=pre[r];

    return r;

}

void mix(int x,int y)

{

    int r=find(x);

    int l=find(y);

    if(l!=r)

        pre[l]=r;

    else

        flag=0;

}

int main()

{

    int a,b;

    while(scanf("%d %d",&a,&b))

    {

        if(a==-1&&b==-1)

            break;

        if(a==0&&b==0)

        {

            cout<<"Yes"<<endl;

            continue;

        }

        for(int i=0;i<=100005;i++)

            pre[i]=i;

        memset(vis,0,sizeof(vis));

        flag=1;

        mix(a,b);

        vis[a]=vis[b]=1;

        while(scanf("%d %d",&a,&b))

        {

            if(a==0&&b==0)

                break;

            vis[a]=vis[b]=1;

            mix(a,b);

        }

        int sum=0;

        for(int i=1;i<=100005;i++)

        {

            if(vis[i]==1&&pre[i]==i)

                sum++;

            if(sum>1)

            {

                flag=0;

                break;

            }

        }

        if(flag)

            cout<<"Yes"<<endl;

        else

            cout<<"No"<<endl;

    }

    

    return0;

}



原创粉丝点击