//摘自计蒜客:http://www.jisuanke.com/course/35/7056
并查集的查询操作是指查询某个元素的代表。通常用于判断两个元素是否在一个集合内,也是并查集合并操作的基础。
原理如下:
首先对node的类型分类讨论。如果node是所在集合的代表元素,也就是对应有根树根的话,则直接返回node的值;但如果node不是所在集合的代表元素,我们就需要不断递归node的父结点,直到找到了集合的代表元素为止。每个集合都是一个有根树,我们求解一个集合的代表元素,等价于我们要找到一棵树的根。如下图a,b,如果我们要查询的结点是g,那么我们就依次查询g的父结点d,d的父结点f......直到发现f是树的根,我们便停止递归迭代。
代码实现:
#include <iostream>
using namespace std;
class DisjointSet {
private:
int *father;
public:
DisjointSet(int size) {
father = new int[size];
for (int i = 0; i < size; ++i) {
father[i] = i;
}
}
~DisjointSet() {
delete[] father;
}
int find_set(int node) {
if (father[node] != node) {
//我们通过记录node的father信息,不断递归调用find_set查询当前结点的父结点,直到找到有根
//树的根,此时也就意味着我们找到了集合的代表元素了
return find_set(father[node]);
}
return node;
}
};
int main() {
DisjointSet dsu(100);
return 0;
}