http://acm.hdu.edu.cn/showproblem.php?pid=1272
稍稍变异的并查集。
题意:给出几个等价关系,判断通过这些等价关系所有点是否都连通,并且每两个点之间只有一条路可走。若符合这两个条件,输出“Yes”,否则输出"No"。
#include <iostream>
using namespace std;
#define N 100005
int room[N];
bool set[N];
int findfather(int n){
if (n!=room[n])
room[n]=findfather(room[n]);
return room[n];
}
inline void swap(int &a,int &b){
int t;
t=a;
a=b;
b=t;
}
int main(){
#ifndef ONLINE_JUDGE
freopen("1272in.txt","r",stdin);
#endif
int h,t,a,b,i,num;
bool flag;
while (true){
for (i=1;i<N;i++)
room[i]=i;
memset(set,false,sizeof(set));
h=N;
t=0;
scanf("%d%d",&a,&b);
flag=true;
if (a==-1&&b==-1)
break;
while (a&&b){
if (a>b)
swap(a,b);
if (a<h)
h=a;
if (b>t)
t=b;
set[a]=true;
set[b]=true;
a=findfather(a);
b=findfather(b);
if (a==b) //这里判断是否每个点之间只有一条路可走
flag=false;
else {
if (a<=b)
room[b]=a;
else room[a]=b;
}
scanf("%d%d",&a,&b);
}
num=0;
for (i=h;i<=t;i++) //这里判断是否所有点都连通
if (room[i]==i&&set[i])
num++;
if (num>1)
flag=false;
if (flag)
printf("Yes\n");
else printf("No\n");
}
return 0;
}