hdu1272

这虽然是个并查集水题,但是要注意的地方还真的比较多。

首先要所有的房间都连在一个并查集上,然后就是不能存在环......如此应该可以水过.....

#include<iostream>

#include<stdio.h>

#include<string.h>



using namespace std;



struct node{int x;int y;} no[200002];



int f[200002],vis[200002];



int find(int x)

{

    return f[x]==x?x:f[x]=find(f[x]);

}





int main()

{

    int i,a,b,aa,bb,maxx=0,num=0;

    //memset(vis,0,sizeof(vis));

    while(~scanf("%d%d",&a,&b))

    {

        //scanf("%d%d",&a,&b);

        if(a==-1&&b==-1)

            break;

        else if(a==0&&b==0)

        {

            if(num==0)

            {

                printf("Yes\n");

                continue;

            }

            //getchar();

            int flag=0;

            for(i=0;i<=100005;i++)

                f[i]=i;

            for(i=0;i<num;i++)

            {

                aa=find(no[i].x);

                bb=find(no[i].y);

                if(aa==bb)

                {

                    flag=1;

                    break;

                }

                else

                    f[aa]=bb;

            }

            //int cnt=0;

            for(int i=0;i<=100005;i++)

            find(i);

            int cnt=0;

            for(int i=0;i<=100005;i++)

            if(i!=find(i))

            {

                cnt=find(i);

                break;

            }

            for(int i=0;i<=100005;i++)

            if(i!=find(i)&&cnt!=find(i))

            {

                flag=1;

                break;

            }

            if(!flag)

                printf("Yes\n");

            else

                printf("No\n");



            //maxx=0;

            num=0;

            //memset(vis,0,sizeof(vis));

        }

        else

        {

            no[num].x=a;

            no[num++].y=b;

            /*if(maxx<a)

                maxx=a;

            if(maxx<b)

                maxx=b;*/

        }

    }

    return 0;

}

 

你可能感兴趣的:(HDU)