代码
class bingCJ {
private:
int father[MAXN];
public:
//初始化所有的节点的父节点都是本身
void init(int n) {
for(int i = 1; i <= n; i++) {
father[i] = i;
}
}
//找到i节点的祖先(也就是所在集合的代表人物)
// int find(int i) {
// //如果找到祖先就返回
// if(father[i] == i) {
// return i;
// }else {
// return find(father[i]);
// }
// }
//find的路径压缩版本,本质其实就是在找寻的过程中,把父节点都更新成祖先节点,提高查找效率
int find(int i) {
if(father[i] == i) {
return i;
}else {
father[i] = find(father[i]);
return father[i];
}
}
//合并两个节点所在的集合
void unionn(int i, int j) {
//找到他们的祖先
int i_fa = find(i);
int j_fa = find(j);
//将他们的祖先联合在一起
father[i_fa] = j_fa;
}
};