hdu 1272 小希的迷宫

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define MAXN 100005
int father[MAXN];
bool exist[MAXN];
int find(int x)
{
    int i,t;
    for(i=x; father[i]>0; i=father[i]) ;
    while(x!=i)
    {
        t=father[x];
        father[x]=i;
        x=t;
    }
    return i;
}
bool merge(int x,int y)
{
    int fx=find(x),fy=find(y);
    //  printf("x=%d y=%d fx=%d fy=%d\n",x,y,fx,fy);
    if(fx==fy) return false;
    // if(father[y] > 0) return false;
    // father[fy]=fx;
    if(father[fx]>father[fy])
    {
        father[fy]+=father[fx];
        father[fx]=fy;
    }
    else
    {
        father[fx]+=father[fy];
        father[fy]=fx;
    }
    return true;
}
int main()
{
    int i,j,maxid;
    while(scanf("%d %d",&i,&j) && (i!=-1 && j!=-1))
    {
        //    if(i<0) break;
        memset(father,-1,sizeof(father));
        memset(exist,false,sizeof(exist));
        maxid=-1;
        bool ok=true;
        while(i+j)
        {
            if(ok)
            {
                ok=merge(i,j);
                exist[i]=exist[j]=true;
                if(i>maxid) maxid=i;
                if(j>maxid) maxid=j;
            }
            scanf("%d %d",&i,&j);
        }
        for(i=1; i<=maxid; i++)
            if(exist[i]) break;
        int fi=find(i++);
        while(i<=maxid)
        {
            if(exist[i] && find(i) != fi)
            {
                ok=false;
                break;
            }
            i++;
        }
        if(ok) printf("Yes\n");
        else printf("No\n");
    }
    return 0;
}

posted @ 2010-08-27 14:16  菜到不得鸟  阅读(107)  评论(0)    收藏  举报