跳转至

并查集

普通并查集

  • 并查集可以维护无向连通性,并支持动态加边;
  • 并查集可以维护染色问题:每次操作给定两种颜色 \(a,b\),将所有颜色为 \(a\) 的点染为 \(b\)
int fa[N];
void init() {
    for(int i = 1; i <= n; i++) fa[i] = i;
}
int find(int x) {
    if(fa[x] == x) return x;
    return fa[x] = find(fa[x]);
}
void merge(int x, int y) {
    fa[find(y)] = find(x);
}

P4119 [Ynoi2018] 未来日记

分块

YbtOj 沧海桑田

题解

并查集优化

路径压缩

简洁,高效,常用,均摊复杂度

代码见上文

启发式合并

简洁,稍慢,非均摊

int fa[N], sz[N];
void init() {
    for(int i = 1; i <= n; i++) fa[i] = i, sz[i] = 1;
}
int find(int x) {
    if(fa[x] == x) return x;
    return find(fa[x]);
}
void merge(int x, int y) {
    x = find(x), y = find(y);
    if(sz[y] > sz[x]) swap(x, y);
    fa[y] = x;
    sz[x] += sz[y];
}

带权并查集

带权并查集通常用来维护带权连通性问题

P1196 [NOI2002] 银河英雄传说

扩展域并查集

扩展域并查集通常用来维护动态 \(k\)-染色问题

P2024 [NOI2001] 食物链

P5787 二分图 /【模板】线段树分治

线段树分治