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;
}

posted @ 2011-04-21 13:15  L..  阅读(110)  评论(0编辑  收藏  举报