题干

并查集的基本实实现
#include <iostream>
using namespace std;
int set[1000];
void InitDisjointSet(int n){
for(int i = 0;i<n;++i){
set[i] = i;
}
}
int FindDisjointSet(int u){
if(u == set[u]){
return u;
}
else{
set[u] = FindDisjointSet(set[u]);
return set[u];
}
}
int UnionDisjointSet(int u,int v){
int uRoot = FindDisjointSet(u);
int vRoot = FindDisjointSet(v);
set[vRoot] = uRoot;
}
int main() {
int n = 9;
InitDisjointSet(n);
UnionDisjointSet(1,2);
UnionDisjointSet(1,3);
UnionDisjointSet(1,4);
UnionDisjointSet(5,6);
UnionDisjointSet(5,7);
UnionDisjointSet(0,8);
for(int i = 0;i<9;++i){
printf("No = %d,root = %d\n",i,FindDisjointSet(i));
}
return 0;
}
题目的C++实现
#include <iostream>
using namespace std;
int set[1001];
void InitDisjointSet(int n){
for(int i = 0;i<n;++i){
set[i] = i;
}
}
int FindDisjointSet(int u){
if(u == set[u]){
return u;
}
else{
set[u] = FindDisjointSet(set[u]);
return set[u];
}
}
int setCount;
int UnionDisjointSet(int u,int v){
int uRoot = FindDisjointSet(u);
int vRoot = FindDisjointSet(v);
if(uRoot != vRoot){
--setCount;
}
set[vRoot] = uRoot;
}
int main() {
int n,m;
while(scanf("%d%d",&n,&m) != EOF){
if(n==0){
break;
}
InitDisjointSet(n+1);
setCount = n;
for(int i = 0;i < m;++i){
int u,v;
scanf("%d%d",&u,&v);
UnionDisjointSet(u,v);
}
printf("%d\n",setCount-1);
}
}