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
");
                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
");
            else
                printf("No
");

            //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;
}
原文地址:https://www.cnblogs.com/ziyi--caolu/p/3476762.html