HDU 1232 畅通工程
并查集 找连通分量 水之
#include <stdio.h>
int set[1001];
int find(int x){
while(set[x] != x)
x = set[x];
return x;
}
void merge(int x,int y){
int fx , fy;
fx = find(x);
fy = find(y);
if(fx != fy){
set[fx] = fy;
}
}
int main(){
int m,n,i,cnt,x,y;
while(scanf("%d",&n),n){
for(i = 1; i <= 1000; ++i){
set[i] = i;
}
scanf("%d",&m);
for(i = 0; i < m; ++i){
scanf("%d%d",&x,&y);
merge(x,y);
}
//计数 统计有几个以自己为根的数目减1 就是答案,减一因为若有三个连通分量,只要两条边就可以
cnt = -1;
for(i = 1; i <= n; i++){
if(set[i] == i){
cnt++;
}
}
printf("%d\n",cnt);
}
return 0;
}