本题链接:http://acm.hdu.edu.cn/showproblem.php?pid=1232
本题使用的是并查集,AC代码:
#include<stdio.h>
int per[1100];
int n,m;
void inid(){
int i;
for(i=1;i<=n;i++){
per[i]=i;
}
}
int find(int x){
int r=x;
while(r!=per[r])
r=per[r];
int j,i=x;
while(i!=r){
j=per[i];
i=j;
per[i]=r;
}
return r;
// if(x==per[x])
// return x;
// else return per[x]=find(per[x]);
// int r=x;
// while(r!=per[r]){
// r=per[r];
// }
per[x]=r;
// return r;
}
void join(int x,int y){
int fx,fy;
fx=find(x);
fy=find(y);
if(fx!=fy)
per[fx]=fy;
}
int main(){
int x,y;
while(scanf("%d",&n)&&n){
scanf("%d",&m);
inid();
for(int j=0;j<m;j++){
scanf("%d%d",&x,&y);
join(x,y);
}
int count=0;
for(int k=1;k<=n;k++){
if(per[k]==k)
count++;
}
printf("%d\n",count-1);
}
return 0;
}