hdu1325 并查集

这个题和小希的迷宫很相似但是差一些 有向图和无向图

因为如果是一棵树 根只能有一个 因为是有向图 根肯定是最上面的 它的入度是0 这样的点只能有一个

不能有环 

#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<map>
using namespace std;
int fa[100050];
int vis[100050];
int ru[100050];
int chu[100050];
bool ok;
void init()
{
    for(int i=0;i<100040;i++)
    {
        fa[i]=i;
        vis[i]=0;
        ru[i]=0;
        chu[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 t=0;
    int a,b;
    while(~scanf("%d%d",&a,&b))
    {

        if(a<0&&b<0)
            break;
        t++;
        init();
        if(a==0&&b==0)
            printf("Case %d is a tree.\n",t);
        else
        {
            un(a,b);
            vis[a]=1;
            vis[b]=1;
            chu[a]++;
            ru[b]++;
            while(~scanf("%d%d",&a,&b))
            {
                if(a==0&&b==0)
                break;
                un(a,b);
                vis[a]=1;
                vis[b]=1;
                chu[a]++;
                ru[b]++;
            }
            int ma=0;
            int yi=0;
            int er=0;
            for(int i=0;i<100040;i++)
            {
                if(vis[i]==1)
                {

                    if(fa[i]==i)
                    {
                        ma++;
                    }
                    if(ru[i]==0)
                    {
                        yi++;
                    }
                }
            }

            if(ma==1&&yi==1&&ok==true)
                printf("Case %d is a tree.\n",t);
            else printf("Case %d is not a tree.\n",t);
        }
    }
}

  

你可能感兴趣的:(hdu1325 并查集)