#include<stdio.h>
int pre[1010];
int find(int x){
if(x==pre[x]) return x;
else pre[x]=find(pre[x]);
return pre[x];
}//查询 ,即查找集合的代表元素(查找树根)
//路径压缩采用递归的方法(递归实现简洁、常见)
void join(int x,int y){
int fx=find(x);
int fy=find(y);
if(fx!=fy){
pre[fx]=fy;
}
}//合并
int main(){
int n,m,i,s;
int a,b,fx,fy;
while(scanf("%d",&n),n){
scanf("%d",&m);
for(i=1;i<=n;i++){
pre[i]=i;
}//创建并查集
for(i=0;i<m;i++){
scanf("%d%d",&a,&b);
join(a,b);
}
for(s=0,i=1;i<=n;i++){
if(pre[i]==i) s++;
}
printf("%d\n",s-1);
}
return 0;
}
hdu 1232 畅通工程(并查集)
最新推荐文章于 2021-09-23 13:41:44 发布