HDU1232 畅通工程
#include<cstdio>
#include<iostream>
using namespace std;
const int MAX_K = 150010;
const int MAX_N = 1e5+20;
int n,m,par[1001];
//初始化n个元素
void init(int n){
for(int i=1;i<=n;i++){
par[i]=i;
}
}
int find(int x){
if(par[x]==x){
return x;
}else{
return par[x]=find(par[x]);
}
}
void unite(int x,int y){
x=find(x);
y=find(y);
if(x==y)
return;
if(x!=y)
par[x]=y;
}
bool same(int x,int y){
return find(x)==find(y);
}
int main(){
int a,b;
//freopen("data","r",stdin);
while(~scanf("%d",&n)){
if(n==0)
break;
else{
scanf("%d",&m);
int sum=0;
init(n);//n为节点
//结合在一起
for(int i=0;i<m;i++){
scanf("%d%d",&a,&b);
unite(a,b);
}
//如果根节点相同,则为同一组
for(int i=1;i<=n;i++){
if(par[i]==i)
sum++;
}
printf("%d\n",sum-1);
}
}
return 0;
}
Sample Input
4 2
1 3
4 3
3 3
1 2
1 3
2 3
5 2
1 2
3 5
999 0
0
Sample Output
1
0
2
998