hdu1272 并查集

如果要输出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 并查集)