并查集(Disjoint-set):维护若干不相交集合,支持合并与判定同属一集合,近似常数时间(反阿克曼函数级)。

Description: Disjoint-set data structure. Time:

  • 结构与字段(据实现)

    • 结构体 UF 含成员 vi e,长度为 n;根结点存储为负数,其绝对值表示该集合大小;非根结点存父指针索引。
    • 构造:UF(int n) : e(n, -1) 初始化 n 个独立元素,各自为根且大小为 1。
  • 接口与语义

    • int find(int x):路径压缩查找,若 e[x] < 0 则 x 为根;否则递归并将 e[x] 直接挂到根(e[x] = find(e[x]))。
    • bool sameSet(int a, int b):判断 find(a) == find(b)
    • int size(int x):返回 -e[find(x)],即 x 所在集合的当前大小。
    • bool join(int a, int b):按大小合并(按 e[a]e[b] 的数值比较,注意更“小”的负数表示更“大”的集合):
      • 若已同集合返回 false;
      • 否则保证 a 为更大的根,执行 e[a] += e[b]; e[b] = a;,返回 true。
  • 复杂度

    • 采用路径压缩与按大小合并,单次操作的摊还复杂度为 O(α(N))。

关联节点