首页 > 其他 > 详细

hdu1272 并查集

时间:2016-02-15 00:48:28      阅读:329      评论:0      收藏:0      [点我收藏+]

如果要输出yes 需要满足

1  这个图连通

2  没有回路

3  0 0 也是yes

看它有没有回路 在un的时候做一次判断就可以了

然后是判断连通 在这里采用的方法是扫一遍 如果这个点出现过就判断(用vis看是否出现) 然后如果它作为根节点 最后根节点只能是一个

和上次做欧拉用的判断连通办法不一样 上一个更省时间不过更麻烦吧..

#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<map>
using namespace std;
int fa[100050];
int vis[100050];
bool ok;
void init()
{
    for(int i=0;i<100040;i++)
    {
        fa[i]=i;
        vis[i]=0;
    }
    ok=true;
}
int find(int i)
{
    return fa[i]==i?i:find(fa[i]);
}
void un(int a,int b)
{
    int aa=find(a);
    int bb=find(b);
    if(aa==bb)
        ok=false;
    else
        fa[aa]=bb;
    return ;
}
int main()
{
    int a,b;
    while(~scanf("%d%d",&a,&b))
    {
        if(a==0&&b==0)
            printf("Yes\n");
        else
        {


        if(a==-1&&b==-1)
            break;
        init();
        un(a,b);
        vis[a]=1;
        vis[b]=1;
        while(~scanf("%d%d",&a,&b))
        {
            if(a==0&&b==0)
                break;
            un(a,b);
            vis[a]=1;
            vis[b]=1;
        }
        int many=0;
        for(int i=0;i<100040;i++)
        {
            if(fa[i]==i&&vis[i]==1)
            {
                many++;
            }
        }
        if(many!=1)
            ok=false;
        if(ok==true)
            printf("Yes\n");
        else printf("No\n");
        }
    }
}

  

 

hdu1272 并查集

原文:http://www.cnblogs.com/rayrayrainrain/p/5189788.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!