支持撤销(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() 相关逻辑。

关联节点