可撤销并查集

可撤销并查集

按秩合并来保证复杂度正确。

每次合并的时候记录一下是是怎么连边的,撤销的时候断开这条边就行了。

struct DSU{
	int n,f[N],siz[N];
	int stk[N],top;
	void init(int x){n=x;for(int i=1;i<=x;i++)f[i]=i,siz[i]=1;}
	void merge(int t,int x,int y){
		while(f[x]!=x)x=f[x];
		while(f[y]!=y)y=f[y];
		if(x==y)return ;
		if(siz[x]>siz[y])std::swap(x, y);
		siz[y]+=siz[x];f[x]=y;stk[++top]=x;
		op[t]=0;
	}
	void pop(){
		int x=stk[top--];
		siz[f[x]]-=siz[x];f[x]=x;
	}
	int query(int x,int y){
		while(f[x] != x)x=f[x];
		while(f[y] != y)y=f[y];
		return x==y;
	}
};
posted @   do_while_true  阅读(80)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?

This blog has running: 1845 days 1 hours 33 minutes 19 seconds

点击右上角即可分享
微信分享提示