http://acm.hdu.edu.cn/showproblem.php?pid=1232
#include<stdio.h>
#include<string.h>
#define N 1010
int a[1010];
int find(int t)
{
int r=t;
while(a[r]!=r) //找父节点
{
r=a[r];
}
int x=t,tem;
while(x!=r) //路径压缩
{
tem=a[x];
a[x]=r;
x=tem;
}
return r;
}
int main()
{
int n,m,x,y;
int n1,n2;
int i,s;
while(scanf("%d",&n),n)
{
s=0;
for(i=1;i<=n;i++)//刚开始父节点均为自身
a[i]=i;
scanf("%d",&m);
for(i=0;i<m;i++)
{
scanf("%d%d",&x,&y);
n1=find(x);
n2=find(y);
if(n1!=n2)
{
a[n1]=n2; //如果父节点不同,则将其中一个<的父节点>变为另一个的父节点的<父节点>,即一个点只能有一个父节点
//a[x]=y; 错错错!!!
}
}
for(i=1;i<=n;i++) //判断有多少个父节点
if(a[i]==i)
s++;
printf("%d\n",s-1);
}
return 0;
}