题目:http://acm.hdu.edu.cn/showproblem.php?pid=1232
#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
const int maxn=1005;
int father[maxn],ans[1005];
int find(int x){ //查找并认爸爸
if(x!=father[x])
father[x]=find(father[x]);
return father[x];
}
void Union(int x,int y){ //x的爸爸是y
int a=find(x);
int b=find(y);
if(a==b)
return;
father[a]=b;
}
int main(){
int n,m,a,b;
while(scanf("%d%d",&n,&m)==2&&n){
fill(ans,ans+maxn,0);
fill(father,father+maxn,0);
for(int i=1;i<=n;i++){
father[i]=i;
}
for(int i=0;i<m;i++){
scanf("%d%d",&a,&b);
if(a>b)
swap(a,b);
Union(a,b);
}
int cnt=0;
for(int i=1;i<=n;i++){
ans[find(i)]++;
}
for(int i=1;i<=n;i++){
if(ans[i])
cnt++;
}
cnt--;
if(cnt<0)
printf("0\n");
else
printf("%d\n",cnt);
}
return 0;
}