#include<stdio.h>
#define max 1005
int data[max];
int find_set(int x){
if(data[x]==-1)
return x;
data[x]=find_set(data[x]);
return data[x];
}
void union_set(int x,int y){
int a=find_set(x);
int b=find_set(y);
if(a!=b){
data[a]=b;
}
}
int main(){
int n,m;
int count;
int a,b;
int i;
while(scanf("%d",&n)!=EOF){
if(n==0)
break;
count=0;
for(int i=1;i<=n;i++)
data[i]=-1;
scanf("%d",&m);
for(i=0;i<m;i++){
scanf("%d%d",&a,&b);
union_set(a,b);
}
for(int i=1;i<=n;i++){
if(data[i]==-1)
count++;
}
count--;
printf("%d\n",count);
}
return 0;
}Problem Description原文:http://blog.csdn.net/sn_zzy/article/details/23595035