本题链接:http://acm.hdu.edu.cn/showproblem.php?pid=1272
本题使用的是并查集,AC代码:
#include<stdio.h>
int per[100100];
int ans[100100];
int flag;
int find(int x)
{
int r=x;
while(r!=per[r])
r=per[r];
int j,i=x;
while(i!=r)
{
j=per[i];
i=j;
per[i]=r;
}
return r;
}
void init()
{
for(int i=1;i<=100000;i++)
{
ans[i]=0;
per[i]=i;
}
}
void join(int a,int b)
{
int fa=find(a);
int fb=find(b);
if(fa!=fb)
per[fa]=fb;
else flag=0;
}
int main()
{
int n,m;
while(scanf("%d%d",&n,&m)!=EOF&&(n!=-1&&m!=-1))
{
if(n==0&&m==0)
{
printf("Yes\n");
continue;
}
init();
join(n,m);
flag=1;
ans[n]=ans[m]=1;
while(scanf("%d%d",&n,&m)!=EOF&&(n||m))
{
ans[n]=ans[m]=1;
join(n,m);
}
int f=0;
for(int i=1;i<=100000;i++)
{
if(per[i]==i&&ans[i])
f++;
if(f>1)
{
flag=0;
break;
}
}
if(flag)
printf("Yes\n");
else printf("No\n");
}
return 0;
}