码迷,mamicode.com
首页 > 其他好文 > 详细

可撤销并查集模板

时间:2020-12-03 12:16:10      阅读:7      评论:0      收藏:0      [点我收藏+]

标签:ini   tac   unit   air   撤销   max   stack   while   pop   

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;

可撤销并查集模板

标签:ini   tac   unit   air   撤销   max   stack   while   pop   

原文地址:https://www.cnblogs.com/ucprer/p/14055957.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!