前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >并查集

并查集

作者头像
嘉嘉123
发布2023-02-23 21:33:29
1.7K0
发布2023-02-23 21:33:29
举报
文章被收录于专栏:嘉嘉的博客

并查集是一种动态维护多个不重复集合

在并查集中,每个集合都有自己的代表元素。

一个树 fa 记录每一个元素的归属关系(存储所属集合代表元素的下标)。

具体:

初始状态:

即,每个元素都是一个单独的集合

代码语言:javascript
复制
int fa[10009];
for (int i = 0; i < n; i++) fa[i] = i;

常见操作

Get

查询一个元素属于哪一个集合(通常题目中会问两个元素是否属于同一集合)

代码语言:javascript
复制
int find(int x) {
	if (fa[x] == x) return x;
	return find(fa[x]);
}

(查询某元素所属集合的代表元素)

那么请考虑这样一种情况:

它退化成了一条链!这样时间复杂度就会大大增加!那么假如元素直接指向代表元素,那假如代表元素迁移(见后)了呢?就在find时实时更新呗!

代码语言:javascript
复制
int find(int x) {
	if (fa[x] == x) return x;
	return fa[x] = find(fa[x]);
}

仔细观察代码你会发现只添加了 fa[x]= 这几个字。这就是路径压缩

(有点像记忆化搜索?

查询两个元素是否属于同一集合的代码也很简单

代码语言:javascript
复制
bool is_in_one_set(int b, int c){
    return find(b) == find(c);
}

Merge

把两个元素 a b 所在的集合合并为一个

随意修改 a b 中一个的父元素为另一个的父元素

代码语言:javascript
复制
void merge(int a, int b) {
	int fa_ = find(a);
	int fb = find(b);
	fa[fa_] = fb;
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2023-01-19,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 常见操作
  • Get
  • Merge
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档