HDU-1272-小希的迷宫
http://acm.hdu.edu.cn/showproblem.php?pid=1272
基本的并查集
#include<iostream>
#include<cstdio>
using namespace std;
#define N 100010
int f[N];
int mark[N];
int find(int x)
{
int r=x;
while(f[r]!=r)
r=f[r];
f[x]=r;
return f[x];
}
void merege(int x,int y)
{
f[x]=y;
}
int main()
{
int min,max;
int a,b,flag,aa,bb,count,i;
while(scanf("%d%d",&a,&b)!=EOF)
{
if(a==-1&&b==-1)
break;
if(a==0&&b==0)
{
printf("Yes\n");
continue;
}
flag=0;
for(i=1;i<100010;i++)
f[i]=i;
memset(mark,0,sizeof(mark));
max=-1;
min=99999999;
while(a||b)
{
if(a>max)
max=a;
if(b>max)
max=b;
if(a<min)
min=a;
if(b<min)
min=b;
mark[a]=mark[b]=1;
aa=find(a);
bb=find(b);
if(aa==bb)
flag=1;
else
merege(aa,bb);
scanf("%d%d",&a,&b);
}
if(flag)
{
printf("No\n");
continue;
}
count=0;
for(i=min;i<=max;i++)
if(mark[i]&&f[i]==i)
count++;
if(count==1)
printf("Yes\n");
else
printf("No\n");
}
return 0;
}