- 编号代表每一个元素。
- 数组par表示的是父亲的编号,也就是前驱。
- par[x] = x时,x是所在的树的根。
代码如下:
#include <iostream>
using namespace std;
const int N = 100010;
int par[N], ranks[N];void init(int n) { //初始化n个元素for (int i = 1; i <= n; i++) {par[i] = i;ranks[i] = 0;}
}int find(int x) { //查询树的根if (par[x] == x)return x;elsereturn par[x] = find(par[x]);
}void unit(int x, int y) { //合并x和y所属的集合x = find(x);y = find(y);if (x == y)return ;if (ranks[x] < ranks[y])par[x] = y;else {par[y] = x;if (ranks[x] == ranks[y])ranks[x]++;}
}bool same(int x, int y) { //判断x和y是否属于同一个集合return find(x) == find(y);
}