带权并查集有哪些操作,详细讲解一下,并写一下参考代码。
时间: 2023-03-28 18:04:49 浏览: 91
带权并查集是一种数据结构,用于维护一些元素之间的关系。它支持以下操作:
1. 初始化:将每个元素都看作一个单独的集合,每个集合的代表元素是它本身,每个元素的权值为1。
2. 查找:查找元素所在的集合的代表元素,同时返回该元素的权值。
3. 合并:将两个集合合并成一个集合,其中一个集合的代表元素成为另一个集合的子节点,同时更新子节点的权值。
下面是参考代码:
```c
#define MAXN 100005
int fa[MAXN], val[MAXN];
void init(int n) {
for (int i = 1; i <= n; i++) {
fa[i] = i;
val[i] = 1;
}
}
int find(int x) {
if (fa[x] == x) return x;
int root = find(fa[x]);
val[x] *= val[fa[x]];
return fa[x] = root;
}
void merge(int x, int y, int v) {
int fx = find(x), fy = find(y);
if (fx != fy) {
fa[fx] = fy;
val[fx] = val[y] * v / val[x];
}
}
```
其中,fa[i] 表示元素 i 的父节点,val[i] 表示元素 i 的权值。在 find 操作中,我们递归查找元素的父节点,并将其权值乘上父节点的权值,以便在合并操作中更新子节点的权值。在 merge 操作中,我们先找到 x 和 y 所在的集合的代表元素 fx 和 fy,然后将 fx 的父节点设置为 fy,同时更新 fx 的权值。
阅读全文