hdu 1272 小希的迷宫

并查集裸题,可以用来学习并查集的性质

1.并查集判断是否成环,如果一条边的两个点的祖先相同,那么成环

2.整个祖先数组中p[i]=i个个数就是连通分量的个数

 

题目要求:

1.若没哟普任何边直接输入0 0 要输出Yes

2.若成环,No

3.不管是否成环,图不连通,No

4.注意输入中的点是任意的,编号并不连续,所以要标记哪些点出现在输入中,没有出现在输入中的点不要管

 

#include <cstdio>
#include <cstring>
#define N 100010
int p[N],use[N];

int find(int x)
{
    while(x!=p[x])
        x=p[x];
    return x;
}

int main()
{
    int u,v,x,y,OK;
    while(1)
    {
        OK=1;
        scanf("%d%d",&u,&v);
        if(u==-1 && v==-1)
            break;
        else if(u==0 && v==0)
            printf("Yes\n");
        else
        {
            for(int i=1; i<N; i++)
            { p[i]=i; use[i]=0; }
            use[u]=use[v]=1;
            x=find(u);
            y=find(v);
            if(x!=y)
                p[x]=y;
            else
            {
                printf("No\n");
                continue;
            }
            while(1)
            {
                scanf("%d%d",&u,&v);
                if(u==0 && v==0) break;
                use[u]=use[v]=1;
                x=find(u);
                y=find(v);
                if(x!=y)
                    p[x]=y;
                else
                    OK=0;
            }
            int count=0;
            for(int i=1; i<N; i++)
                if(use[i] && p[i]==i)
                    count++;
            if(count>1) OK=0;
            if(OK) printf("Yes\n");
            else   printf("No\n");
        }
    }
    return 0;
}
posted @ 2012-11-23 17:55  Titanium  阅读(161)  评论(0编辑  收藏  举报