当前位置: 首页 > news >正文

acwing算法基础之数据结构--并查集算法

目录

  • 1 基础知识
  • 2 模板
  • 3 工程化

1 基础知识

并查集支持O(1)时间复杂度实现:

  1. 将两个集合合并。
  2. 询问两个元素是否在一个集合中。

基本原理:每个集合用一颗树来表示。树根的编号就是整个集合的编号。每个结点存储它的父结点,p[x]表示x的父结点。

问题1:如何判断树根:p[x] == x
问题2:如何求x的集合编号:while (p[x] != x) x = p[x];。上述为朴素做法,可以通过路径压缩,进行优化。

int find(int x) {if (p[x] != x) p[x] = find(p[x]);return p[x];
}

问题3:如何合并两个集合:px是x的集合编号,py是y的集合编号:p[px] = py

2 模板

(1)朴素并查集:int p[N]; //存储每个点的祖宗节点// 返回x的祖宗节点int find(int x){if (p[x] != x) p[x] = find(p[x]);return p[x];}// 初始化,假定节点编号是1~nfor (int i = 1; i <= n; i ++ ) p[i] = i;// 合并a和b所在的两个集合:p[find(a)] = find(b);(2)维护size的并查集:int p[N], size[N];//p[]存储每个点的祖宗节点, size[]只有祖宗节点的有意义,表示祖宗节点所在集合中的点的数量// 返回x的祖宗节点int find(int x){if (p[x] != x) p[x] = find(p[x]);return p[x];}// 初始化,假定节点编号是1~nfor (int i = 1; i <= n; i ++ ){p[i] = i;size[i] = 1;}// 合并a和b所在的两个集合:size[find(b)] += size[find(a)];p[find(a)] = find(b);(3)维护到祖宗节点距离的并查集:int p[N], d[N];//p[]存储每个点的祖宗节点, d[x]存储x到p[x]的距离// 返回x的祖宗节点int find(int x){if (p[x] != x){int u = find(p[x]);d[x] += d[p[x]];p[x] = u;}return p[x];}// 初始化,假定节点编号是1~nfor (int i = 1; i <= n; i ++ ){p[i] = i;d[i] = 0;}// 合并a和b所在的两个集合:p[find(a)] = find(b);d[find(a)] = distance; // 根据具体问题,初始化find(a)的偏移量

3 工程化

class UnionFind {
public:UnionFind(int n) {this->n = n;p.resize(n);cnt.resize(n);d.resize(n);for (int i = 0; i < n; ++i) {p[i] = i;cnt[i] = 1;d[i] = 0;}}int find(int x) {if (x != p[x]) {int u = find(p[x]);d[x] += d[p[x]];p[x] = u;}return p[x];}void merge(int x, int y) {int px = find(x), py = find(y);if (px != py) {p[px] = py;cnt[py] += cnt[px];		}return;}int size(int x) {//返回x所在集合的大小return cnt[find(x)];}
private:int n;vector<int> p; //存储父结点vector<int> cnt; //存储集合大小,根结点的cnt才有意义vector<int> d; //存储到根结点的距离
};
http://www.lryc.cn/news/218822.html

相关文章:

  • k8s:二进制搭建 Kubernetes v1.20
  • SpringBoot系列-1启动流程
  • 【记】一次common模块导入无效的bug
  • 1.Netty概述
  • YOLO目标检测——真实道路车辆检测数据集【含对应voc、coco和yolo三种格式标签】
  • 【Solidity】Solidity中的基本数据类型和复合数据类型
  • Flutter Set存储自定义对象时 如何保证唯一
  • Docker容器中执行throttle.sh显示权限报错:RTNETLINK answers: Operation not permitted
  • 【Linux】jdk、tomcat、MySQL环境搭建的配置安装,Linux更改后端端口
  • 【WinForm详细教程七】WinForm中的DataGridView控件
  • SpringCloudTencent(上)
  • linux硬盘挂载(linux 修改某个磁盘挂载到新目录)
  • hdlbits系列verilog解答(always块case语句)-33
  • 3D医学三维技术影像PACS系统源码
  • python 之softmx 函数
  • 第3章_基本select语句
  • GPT3.5+文心一言+chatGLM 计算和代码生成能力简单对比
  • 手搓一个ubuntu自动安装python3.9的sh脚本
  • volte使用方法 nodejs版本切换
  • Oracle安全基线检查
  • @Slf4j将日志记录到磁盘和数据库
  • 2023年中国制糖行业研究报告
  • 从使用的角度看 ByConity 和 ClickHouse 的差异
  • Eureka处理流程
  • 排序算法
  • 华为政企光传输网络产品集
  • 四路IC卡读卡器通信协议
  • JavaFX作业
  • 【使用Python编写游戏辅助工具】第五篇:打造交互式游戏工具界面:PySide6/PyQT高效构建GUI工具
  • 06.Oracle数据备份与恢复