可撤销并查集模板
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 [线段树分治,可撤销并查集]