并查集 (学习笔记)(25.11.18)

并查集 (学习笔记)

基础并查集

概述

通过递归和树形结构,实现对于某些点的合并,使其在合成完毕后可以使用\(O(logn)\)\(O(1)\)时间完成查询

实现操作

find数组

int find(int x){
	if(fa[x] == x) return x;
	else return find(fa[x]);
}

路径压缩优化

void add(int x, int y){
	x = find(x), y = find(y);
	if(x==y) continue;
	fa[x] = y;
}

按秩合并优化

可以理解为将两个结构去合并的时候,较短的去与长的相连,可以做到优化,所以我们可以想到,去做一个size的记录,之后在合并的时候判断

void add(int x, int y){
 x = find(x), y = find(y);
 if(x==y) continue;
 if(siz[y] < siz[x]) swap(x,y);
 if(siz[x] == siz[y]) siz[y] = siz[x]+1;
 fa[x] = y;
}

可持久化并查集

posted @ 2025-11-18 17:44  Yuriha  阅读(4)  评论(0)    收藏  举报