并查集主要是由一个father数组,以及find和merge两个函数构成。
1、初始化father数组
void init() {
for (int i = 1; i <= n; ++i) {
father[i] = i;
}
}
2、查找
int get(int x) {
if (father[x] == x) { // x 结点就是根结点
return x;
}
return get(father[x]); // 返回父结点的根结点
}
3、合并
void merge(int x, int y) {
x = get(x);
y = get(y);
if (x != y) { // 不在同一个集合
father[y] = x;
}
}
4、路径压缩
int get(int x) {
if (father[x] == x) { // x 结点就是根结点
return x;
}
return father[x] = get(father[x]); // 返回父结点的根结点,并另当前结点父结点直接为根结点
}
参考来源:计蒜客