并查集的作用就是把一个数据集分成若干个子集,每个子集内部数据可以互联互通,而子集之间则不具有连通性。
并查集的底层结构类似于堆,也是用数组描述一种树结构,但不同的是,堆是一棵独立的二叉树,并查集的树是多叉树,而且可能不止一棵树(也就是森林)。
在并查集中,我们把相互独立的数据集称为连通分量,连通分量在逻辑上可以形象地描述为一棵树,每棵树都有一个根节点,其他的元素都会直接或间接指向根节点。
class UnionFind {
private:
int count;
vector<int> parent;
public:
UnionFind(int n) : parent(n) {
count=n;
for (int i=0;i<n;i++) {
parent[i]=i;
}
}
/* 查找根节点 */
int findRoot(int x) {
if (x!=parent[x]) {
parent[x]=findRoot(parent[x]);
}
return parent[x];
}
/* 合并操作 */
void unionRoot(int x, int y) {
int root_x=findRoot(x);
int root_y=findRoot(y);
if (root_x != root_y) {
parent[root_x]=root_y;
count--;
}
}
/* 判断x,y是否属于同一连通分量 */
bool isConnect(int x, int y) {
return findRoot(x)==findRoot(y);
}
/* 返回连通分量个数 */
int getCount() {
return count;
}
};