acm.hdu.edu.cn/showproblem.php?pid=1232
可以使用并查集解决,每一堆隶属于一个结点的点相当于一个新点,因为只要能到达其中一个就能到达这个集合中所有的点。
AC代码:
#include <stdio.h>
#include <string.h>
#include <iostream>
#include <algorithm>
using namespace std;
int n,m,father[1010];
void Init(){
for(int i=0; i<=n; i++)
father[i] = i;
}
int Find(int x){
if(x != father[x])
father[x] = Find(father[x]);
return father[x];
}
int main(){
while(scanf("%d%d",&n,&m) == 2){
if(!n) break;
Init();
for(int i=0; i<m; i++){
int u,v;
scanf("%d%d",&u,&v);
int uu = Find(u), vv = Find(v);
father[uu] = vv;
}
int cnt = 0;
for(int i=1; i<=n; i++)
if(father[i] == i) cnt++;
cnt--;
printf("%d\n",cnt);
}
return 0;
}