http://acm.hdu.edu.cn/showproblem.php?pid=1272
題意:判斷是否所有點都連通且不存在迴路。
#include<stdio.h>
#include<string.h>
int set[100000+10];
int find(int x)
{
while(set[x]!=x)
x=set[x];
return x;
}
void merge(int x,int y)
{
x=find(x);
y=find(y);
if(y<x)
set[x]=y;
else if(y>x)
set[y]=x;
}
main()
{
int x,y,f,tmp,use[100000+10],t;
while(scanf("%d %d",&x,&y)==2)
{
if(x==-1&&y==-1)
break;
if(x==0&&y==0)
{
printf("Yes\n");
continue;
}
memset(use,0,sizeof(use));
for(f=1;f<=100001;f++)
set[f]=f;
merge(x,y);
use[x]=1;
use[y]=1;
t=1;
f=1;
while(scanf("%d %d",&x,&y)&&(x||y))
{
if(!use[x])
{
t++;
use[x]=1;
}
if(!use[y])
{
t++;
use[y]=1;
}
if(find(x)==find(y))
f=0;
else
t--;
merge(x,y);
}
if(f&&t==1)
{
printf("Yes\n");
}
else
{
printf("No\n");
}
}
return 0;
}