可撤销并查集模板

Posted ucprer

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了可撤销并查集模板相关的知识,希望对你有一定的参考价值。

struct UFS {
    stack<pair<int*, int> > stk;
    int fa[maxn], rnk[maxn];
    inline void init(int n) {
        for (int i = 0; i <= n; ++i) fa[i] = i, rnk[i] = 0;
    }
    inline int find(int x) {
        while(x^fa[x]) x = fa[x];
        return x;
    }
    inline void unite(int x, int y) {
        x = find(x), y = find(y);
        if(x == y) return ;
        if(rnk[x] <= rnk[y]) {//先连边,再修改rank,撤销的时候就会最后撤销边
            stk.push({fa+x, fa[x]});
            fa[x] = y;
            if(rnk[x] == rnk[y]) {
                stk.push({rnk+y, rnk[y]});
                rnk[y]++;
            }
        }
        else {
            stk.push({fa+y, fa[y]});
            fa[y] = x;
        }
    }
    inline void undo() {
        *stk.top().first = stk.top().second;
        stk.pop();
    }
}ufs;

以上是关于可撤销并查集模板的主要内容,如果未能解决你的问题,请参考以下文章

CodeForces - 891C: Envy(可撤销的并查集&最小生成树)

CF576E Painting Edges [线段树分治,可撤销并查集]

CF576E Painting Edges [线段树分治,可撤销并查集]

Codeforces 938G 线段树分治 线性基 可撤销并查集

CF 891C Envy 最小生成树+可撤销并查集

数据结构小结