一个集合中的元素,仅有的关系就是同属于这个集合,并查集就是用来维护若干集合的一种数据结构。
并查集有两个基本操作:
为了方便地实现合并以及查找操作,我们在一个集合中规定唯一一个根结点,并将这个根结点作为该集合的标志。
开始时所有元素都是一个独立的集合:
int parent[MAXN];
for(int i = 0;i < n;i++)
{
parent[i] = i; //i元素的父结点初始化为自己,也可以初始化为-1
}
parent
指向另一个集合的根结点即可。class unionFind {
private:
vector<int> parents_;
vector<int> ranks_;
public:
unionFind(int n) {
ranks_ = vector<int>(n, 0);
parents_ = vector<int>(n, 0);
for(int i = 0;i < parents_.size();i++) {
parents_[i] = i;
}
}
// get the root of x
int Find(int x) {
// path compression
if(x != parents_[x]) {
parents_[x] = Find(parents_[x]);
}
return parents_[x];
}
// merge set u and v
// false -> u and v are already in one set
bool Union(int u, int v) {
int rootu = Find(u);
int rootv = Find(v);
if(rootu == rootv)
return false;
// merge low rank to high rank
if(ranks_[u] < ranks_[v]) {
parents_[u] = v;
}
else if(ranks_[v] < ranks_[u]) {
parents_[v] = u;
}
else {
parents_[u] = v;
ranks_[v]++;
}
return true;
}
};
原文:https://www.cnblogs.com/EIMadrigal/p/11729710.html