专栏文章
【笔记】带权并查集
算法·理论参与者 1已保存评论 0
文章操作
快速查看文章及其快照的属性,并进行相关操作。
- 当前评论
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @mioepi5l
- 此快照首次捕获于
- 2025/12/02 17:59 3 个月前
- 此快照最后确认于
- 2025/12/02 17:59 3 个月前
1. 并查集
介绍
并查集是一种用于管理元素所属集合的数据结构,实现为一个森林,其中每棵树表示一个集合,树中的节点表示对应集合的元素。
其支持两种操作:
- 合并(Union):合并两个元素所属集合(合并对应的树);
- 查询(Find):查询某个元素所属集合(查询对应的树的根节点),这可以用于判断两个元素是否属于同一集合。
初始化及基本操作
初始时,每个元素都位于一个单独的集合,每个节点的父亲指针都指向自己
CPPfor(int i=1;i<=n;++i) fa[i] = i;
查询当前元素所在树的根节点,我们需要沿着树向上移动,直至找到根节点。
CPPint getfa(int x) {return fa[x]==x?x:fa[x]=getfa(fa[x]);}//路径压缩
合并二者所在集合,需要找到二者的所在树根节点,然后,将二者根节点相连即可。
CPPint fax=getfa(x), fay=getfa(y);
fa[fax]=fay;
时间复杂度为 。
2.带权并查集
我们在普通的并查集基础上,在并查集的边上定义某种权值、以及这种权值在路径压缩时产生的运算,从而解决更多的问题。
例:令 为节点 到父节点 的距离,这样距离的计算方式是累加,在路径压缩的时候,我们只需要不断累加路径总长,最后压缩即可。
CPPint getfa(int x)
{
if (fa[x]==x) return x;
int p=getfa(fa[x]);
d[x] += d[fa[x]];
return fa[x] = p;
}
相关推荐
评论
共 0 条评论,欢迎与作者交流。
正在加载评论...