可撤销并查集

可撤销并查集

可持久化并查集,即可撤销并查集,支持回退到上个版本信息。

考虑启发式合并,于是每次操作都只会修改 \(\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;
posted @ 2026-10-06 20:54  TH911  阅读(3)  评论(0)    收藏  举报