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;
}
朋友们,虽然这个世界日益浮躁起来,只要能够为了当时纯粹的梦想和感动坚持努力下去,不管其它人怎么样,我们也能够保持自己的本色走下去。

浙公网安备 33010602011771号