首页 > 代码库 > 半可持久化并查集

半可持久化并查集

  对于常见的可持久化并查集, 我们可以通过 按秩合并 + 可持久化数组 .

  但是, 此半可持久化并查集, 非彼可持久化并查集. 我们不用支持时间旅行, 即不用支持回到过去的某个版本, 而只用储存历史信息.

  

  举个例子来说吧.

  n 个点, 支持两种操作:

    ① 将某两个点之间连边;

    ② 查询在前 t 次操作下, 某两个点是否连通.

  强制在线.

 

核心模型

  给定 n 个点, m 条带权边的无向图.

  求在所有边权不超过 d 的边的作用下, 某个点或某两个点的连通性信息.

  强制在线.

 

  之前举的那个例子也可以这样理解.

  我们只是隐藏起了时间这一维, 只需要将时间量化.

  在时刻 t 将某两个点连边, 就相当于 x 与 y 之间存在一条边, 边权为 t .

 

模型分析

  假如不要求强制在线.

  那么我们的做法是: 将边权从小到大进行排序, 不断加边和查询, 用并查集进行维护.

 

  如果要求强制在线, 我们考虑将并查集的功能进行拓展.

  为了更好的将功能进行拓展, 我们不再使用路径压缩, 而是使用按秩合并.

  只需要多记录一个 w 数组.

  在并查集中, 当点 x 的父亲指向点 y 的时候, 记录 w[x] = 边权 .

  那么我们在查找一个节点 x 在不超过 d 的边权的作用下的并查集时, 只需要将 x 在并查集中从下往上跳, 直到恰好跳到满足 w[x] > d 时停止.

 

功能拓展

  除了询问简单的连通性, 我还可以处理连通分量内的一些信息.

  以 Peaks 一题为例, 我们要查询在边权不超过 d 的边的作用下, 与 x 连通的所有点中, 第 K 大的点权是多少.

  题解见这里: 

半可持久化并查集