#include<cstdio>
#include<iostream>
#define MAX 100
using namespace std;
int par[MAX]; //父亲
int rank[MAX]; //树的高度
//初始化n个元素
void Init(int n){
for(int i=0; i<n; i++){
par[i] = i;
rank[i] = 0;
}
}
//查询树的根
int Find(int x){
if(par[x] == x){
return x;
}
else{
return par[x] = Find(par[x]);
}
}
//合并x和y的所属集合
void Unite(int x, int y){
x = Find(x);
y = Find(y);
if(x == y) return ;
if(rank[x] < rank[y])
par[x] = y;
else{
par[y] = x;
if(rank[x] == rank[y])
rank[x]++;
}
}
//判断x和y是否在同一个并查集
bool Same (int x, int y){
return Find(x) == Find(y);
}
//测试函数
int main(){
int n = 10;
//初始化并查集
Init(n);
//合并前
if(Same(0,1))cout << "YES" << endl;
else cout << "NO" << endl;
cout << Find(0) << " " << Find(1) << endl;
//合并后
Unite(0,1);
if(Same(0,1))cout << "YES" << endl;
else cout << "NO" << endl;
cout << Find(0) << " " << Find(1) << endl;
return 0;
}
使用 《挑战程序设计竞赛》中的代码,方便自己随时观看