/*
分析:
三点:
1、读入过程中,合并集合的时候,如果,当前读入的两个
元素属于同一个集合,那么肯定是No~;
2、不要忘了最后要判断所有的点都要是连通的哦~不能有
孤立的;
3、读入只有0 0的时候,要输出Yes。。。
数据水,房间编号可以是10W,以为要用链表来储存集合来着,
没想到就ac了 - -I ,估计出题的目的就只是初步掌握并查集吧。
2012-07-11
*/
分析:
三点:
1、读入过程中,合并集合的时候,如果,当前读入的两个
元素属于同一个集合,那么肯定是No~;
2、不要忘了最后要判断所有的点都要是连通的哦~不能有
孤立的;
3、读入只有0 0的时候,要输出Yes。。。
数据水,房间编号可以是10W,以为要用链表来储存集合来着,
没想到就ac了 - -I ,估计出题的目的就只是初步掌握并查集吧。
2012-07-11
*/
#include"stdio.h"
#include"string.h"
struct A
{
int hash;
int pre;
}E[100011];
int max(int a,int b)
{
return a>b?a:b;
}
int main()
{
int a,b;
int flag;
int l;
int limit;
int temp;
while(scanf("%d%d",&a,&b),a!=-1&&b!=-1)
{
if(a==0&&b==0) {printf("Yes\n");continue;}
memset(E,0,sizeof(E));
E[a].hash=E[b].hash=1;
E[a].pre=a;
E[b].pre=a;
limit=max(a,b);
flag=0;
while(scanf("%d%d",&a,&b),a||b)
{
if(flag) continue;
limit=max(limit,max(a,b));
if(E[a].hash==0&&E[b].hash==0)
{
E[a].pre=a;
E[b].pre=a;
E[a].hash=E[b].hash=1;
}
else if(E[a].hash==0)
{
E[a].hash=1;
E[a].pre=E[b].pre;
}
else if(E[b].hash==0)
{
E[b].hash=1;
E[b].pre=E[a].pre;
}
else
{
if(E[a].pre==E[b].pre) {flag=1;continue;}
else
{
temp=E[b].pre;
for(l=1;l<=limit;l++) if(E[l].pre==temp) E[l].pre=E[a].pre;
}
}
}
if(flag) {printf("No\n");continue;}
temp=E[limit].pre;
for(l=1;l<=limit;l++) if(E[l].hash&&E[l].pre!=temp) {flag=1;break;}
if(flag) printf("No\n");
else printf("Yes\n");
}
return 0;
}