http://acm.hdu.edu.cn/showproblem.php?pid=1232
#include<cstdio>
#include<algorithm>
#define maxn 1001
using namespace std;
int parent[maxn],M,N;
void UFset(int end)
{
for(int i=1;i<=end;i++)
parent[i] = -1;
}
int Find(int x)
{
int s;
for( s=x; parent[s]>=0; s=parent[s]);
while (s!=x)
{
int tmp;
tmp=parent[x];
parent[x]=s;
x=tmp;
}
return s;
}
void Union( int R1, int R2)
{
int r1 = Find(R1), r2 = Find(R2);
int tmp =parent[r1]+parent[r2];
if( parent[r1]>parent[r2])
{
parent[r1]=r2;
parent[r2]=tmp;
}
else
{
parent[r2]=r1;
parent[r1]=tmp;
}
}
int main()
{
while(~scanf("%d",&N)&&N)
{
scanf("%d",&M);
int roota,rootb,a,b;
UFset(N);
for(int i=0;i<M;i++)
{
scanf("%d%d",&a,&b);
roota=Find(a);
rootb=Find(b);
if(roota!=rootb)Union(a,b);
}
int ans=0;
//printf("\n");
for(int i=1;i<=N;i++)
{
//printf("%d ",parent[i]);
if(parent[i]<0)ans++;
}
printf("%d\n",ans-1);
}
return 0;
}