支持撤销(undo)的并查集:提供时间戳与回滚接口,可在记录修改历史后将结构恢复到任意先前时刻,复杂度 O(log N)。
Description: Disjoint-set data structure with undo. Usage: int t = uf.time(); …; uf.rollback(t); Time:
-
数据结构与字段(依据实现)
- 成员 e(vi):根结点存负数,其绝对值为集合大小;非根存父指针索引。
- 撤销栈 st(vector
):按“(索引, 旧值)”记录对 e 的每次修改,以便回滚恢复。
-
接口与语义
- find(x):无路径压缩,返回 x 所在集合的根(避免压缩以便可回滚)。
- size(x):返回 -e[find(x)],即集合大小。
- time():返回当前栈大小,作为“时间戳”。
- rollback(t):将修改逐项回退到时间 t(恢复 e[st[i].first] = st[i].second,并将 st 截断至 t)。
- join(a, b):按集合大小合并;合并前先把受影响位置 (a, e[a]) 与 (b, e[b]) 依次压入 st,然后执行 e[a] += e[b], e[b] = a;若原本同集合则返回 false。
-
复杂度
- 按文件注释为 O(log N);find 不做路径压缩以支持精确回滚,合并采取按大小策略。
-
说明
- 若不需要撤销,可省略 st、time() 与 rollback() 相关逻辑。