并查集是一种用来管理元素分组情况的数据结构。
朴素并查集(带路径压缩)
// 每个点的父亲节点
int p[N];
// 每个集合的大小
int sz[N];
void init(int n) {
for (int i = 1; i <= n; i ++ ) {
p[i] = i;
sz[i] = 1;
}
}
int find(int x) {
// 递归的路径压缩
if (p[x] != x) p[x] = find(p[x]);
return p[x];
}
void merge(int x, int y) {
x = find(x), y = find(y);
if (x == y) return;
p[x] = y;
sz[y] += sz[x];
}
按秩合并的并查集
// 每个节点的父亲节点
int p[N];
// 每个节点的高度(简单起见,路径压缩后不修改)
int rank[N];
// 每个集合的大小
int sz[N];
void init(int n) {
for (int i = 1; i <= n; i ++ ) {
p[i] = i;
rank[i] = 0;
sz[i] = 1;
}
}
int find(int x) {
if (p[x] != x) p[x] = find(p[x]);
return p[x];
}
void merge(int x, int y) {
x = find(x), y = find(y);
if (x == y) return;
if (rank[x] > rank[y]) swap(x, y);
p[x] = y;
sz[y] += sz[x];
if (rank[x] == rank[y]) rank[y] ++ ;
}
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。