可撤销并查集
可撤销并查集
可持久化并查集,即可撤销并查集,支持回退到上个版本信息。
考虑启发式合并,于是每次操作都只会修改 \(\mathcal O(1)\) 个节点的信息。
然后维护一个栈来记录即可。
合并/查找根节点 \(\mathcal O(\log n)\),撤销 \(\mathcal O(1)\)。空间复杂度 \(\mathcal O(n)\)。
参考代码
constexpr const int N=5e5;
struct undoDsu{
int f[N+1],size[N+1];
vector<int>s;
void build(int n){
for(int i=1;i<=n;i++){
f[i]=i;
size[i]=1;
}
}
int find(int x){
if(f[x]==x){
return x;
}
return find(f[x]);
}
void merge(int u,int v){
u=find(u),v=find(v);
if(u==v){
return;
}
if(size[u]<size[v]){
s.push_back(u);
f[u]=v;
size[v]+=size[u];
}else{
s.push_back(v);
f[v]=u;
size[u]+=size[v];
}
}
void undo(){
if(!s.size()){
return;
}
int x=s.back();
s.pop_back();
size[f[x]]-=size[x];
f[x]=x;
}
}dsu;

浙公网安备 33010602011771号