【基础算法练习】并查集模板

文章目录

  • 算法思想
  • 代码模板
    • 题目描述:
    • 代码
    • 并查集模板
    • 模板题二(求并查集内集合的数量)

算法思想

并查集的核心操作:

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

基本原理:每个集合我们将他维护成一颗树,根节点的值就作为集合的编号,每个节点存储他的父节点,p[x] 就是 x 的父节点

  1. 当 p[x] == x 就证明 p[x] 是树根,就证明 x 指向的是根节点
  2. 我们可以用 while (p[x] != x) x = p[x] 来找到 x 的集合编号
  3. 我们可以用集合 A 的根节点连接上集合 B 的根节点的方式合并两个集合

接下来,看模板

代码模板

模板题:AcWing 836. 合并集合

题目描述:

代码

#include <iostream>
#include <vector>using namespace std;const int N = 100010;vector<int> p(N);// 求 x 的祖先节点(集合的编号)
int find(int x) {if (p[x] != x) p[x] = find(p[x]); // 如果 p[x] 不是 x 的祖先节点, 求 p[x] 的祖先并赋值给 p[x]return p[x]; // 返回 p[x]
}int main()
{int n, m;cin >> n >> m;for (int i = 1; i <= n; i++) p[i] = i;while (m -- ) {char ch;int a, b;cin >> ch >> a >> b;if (ch == 'M') p[find(b)] = find(a);else {if (find(a) == find(b)) cout << "Yes" << endl;else cout << "No" << endl;}}return 0;
}

并查集模板

// 求 x 的祖先节点(集合的编号)+ 路径压缩 
int find(int x) {// 如果 p[x] 不是 x 的祖先节点, 求 p[x] 的祖先并赋值给 p[x]if (p[x] != x) p[x] = find(p[x]); return p[x]; // 返回 p[x]
}

并查集的核心操作 find 求 x 集合的编号(也就是求 x 的祖先节点),这模板包含并查集的路径压缩优化

如何理解?

传进来的参数 x 是集合内的一个数,我们调用 find(x) 就是为了求这个数的集合编号是什么(或者说,求 x 的祖先节点的编号)

记住前面并查集的性质,p[x] 是 x 的父节点,而 p[x] != x,而并查集的根节点的值就是并查集的编号,所以当 p[x] == x 的时候就证明 p[x] 是 x 的祖宗节点,所以这里 if (p[x] != x) p[x] = find(p[x]) 的操作

实际上就是:当 p[x] 不是 x 的祖宗节点,就让 p[x] = find(p[x]) 找他的祖宗节点,找到之后返回 p[x] 就是我们要求的 x 的祖宗节点,也就是集合的编号了

纯享版

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

模板题二(求并查集内集合的数量)

题目链接:AcWing 837. 连通块中点的数量

#include <iostream>
#include <vector>
#include <string>using namespace std;const int N = 100010;vector<int> p(N), Size(N);int find(int x) {if (p[x] != x) p[x] = find(p[x]);return p[x];
}int main()
{int n, m;cin >> n >> m;for (int i = 1; i <= n; i++) {p[i] = i;Size[i] = 1;}while (m -- ) {string s;int a, b;cin >> s;if (s == "C") {cin >> a >> b;if (find(a) == find(b)) continue; // 如果 a b 在同一个集合里, 那就没必要操作了Size[find(b)] += Size[find(a)]; // 将集合 a 元素的数量更新到集合 b 中p[find(a)] = find(b); // 合并集合 a, b(集合 a 并入集合 b)}else if (s == "Q1") {cin >> a >> b;if (find(a) == find(b)) cout << "Yes" << endl;else cout << "No" << endl;}else {cin >> a;cout << Size[find(a)] << endl;}}return 0;
}

我们可以维护一个 Size 数组,根节点上存好集合元素的数量,然后在合并集合的时候维护 Size 数组即可

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/662406.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于Transformer结构的扩散模型综述

&#x1f380;个人主页&#xff1a; https://zhangxiaoshu.blog.csdn.net &#x1f4e2;欢迎大家&#xff1a;关注&#x1f50d;点赞&#x1f44d;评论&#x1f4dd;收藏⭐️&#xff0c;如有错误敬请指正! &#x1f495;未来很长&#xff0c;值得我们全力奔赴更美好的生活&…

npm淘宝镜像过期解决办法

npm淘宝镜像过期解决办法 因为npm 官方镜像&#xff08;registry.npmjs.org&#xff09;在国内访问很慢&#xff0c;我们基本上都会选择切换到国内的一些 npm 镜像&#xff08;淘宝镜像、腾讯云镜像等&#xff09;。由于淘宝原来的镜像&#xff08;registry.npm.taobao.org&am…

Grbl V1.1 Quick Reference CN(AI 翻译)

Grbl是一种开源的嵌入式数控系统&#xff0c;用于控制CNC&#xff08;数控机床&#xff09;运动。本文详细介绍了Grbl的错误代码、报警代码、非Gcode命令、设置、支持的GCode命令、GCode参数以及系统状态。Grbl的错误代码包括对GCode命令不识别、Homing失败、软极限要求启用Hom…

【习题】三方库

判断题 1. 三方组件是开发者在系统能力的基础上进行了一层具体功能的封装&#xff0c;对其能力进行拓展的工具 正确(True) 回答正确 2. 可以通过ohpm uninstall 指令下载指定的三方库 错误(False) 回答正确 3. lottie使用loadAnimation方法加载动画。 正确(True) 回答正…

react中使用useEffcet抛出错误“超出最大更新深度”

目录 【项目中部分代码】&#xff1a; 【说明】&#xff1a; 【抛出错误】&#xff1a;“超出最大更新深度” 【造成原因】&#xff1a; 【例如&#xff1a;】 【解决】&#xff1a; 【项目中部分代码】&#xff1a; // 类组件中&#xff1a;一进页面就拿到要notiveType的…

C语言:文件操作详解

创作不易&#xff0c;友友们给个三连吧&#xff01;&#xff01; 一、为什么我们需要使用文件 我们在写程序的时候&#xff0c;输入的数据是存储在电脑内存中的&#xff0c;如果程序退出内存回收&#xff0c;相应数据也就丢失了&#xff0c;等再次运行程序&#xff0c;就看不到…

编码格式相关

编码格式 编码格式编码格式如何自适应Python如何同时支持多种编码格式python如何判断文件是哪种编码格式编码格式 编码格式是指计算机中用于表示和存储字符、数字、符号等信息的一种规范。常见的编码格式包括 ASCII、UTF-8、UTF-16、GBK 等。 ASCII 码(American Standard Cod…

VR全景技术如何运用在文旅展示,VR全景技术对景区有哪些好处

引言&#xff1a; 随着科技的不断进步和社会的不断发展&#xff0c;VR全景技术越来越受到人们的关注。在文化旅游行业中&#xff0c;VR全景技术的应用为景区提供了全新的展示方式和体验内容&#xff0c;极大地丰富了游客的文化旅游体验。那么VR全景技术能给文旅展示带来哪些好…

SpringBoot集成H2数据库

1&#xff09;添加H2的依赖 <dependency><groupId>com.h2database</groupId><artifactId>h2</artifactId><scope>compile</scope> </dependency>2&#xff09;添加连接配置&#xff0c;启用web控制台 spring:datasource:url…

UE4 C++ UGameInstance实例化

1.创建GameInstance C类 2.在.h添加变量 class 工程名称_API UMyGameInstance : public UGameInstance {GENERATED_BODY()public: //定义了三个公开的变量UMyGameInstance();UPROPERTY(EditAnywhere, BlueprintReadWrite, Category "MyGameInstance")FString Name…

gitlab ci cd 不完全指南

gitlab 可能大家很常用&#xff0c;CI、CD 也应该早有耳闻&#xff0c;但是可能还没有去真正地了解过&#xff0c;这篇文章就是我对 gitlab CI、CD 的一些理解&#xff0c;以及踩过的一些坑&#xff0c;希望能帮助到大家。 什么是 CI、CD CI&#xff08;Continuous Integrati…

云计算底层技术、磁盘技术揭秘虚拟化管理、公有云概述

查看本机是否具备虚拟化支持 硬件辅助虚拟化 处理器里打开 虚拟化Inter VT-x/EPT 或AMD-V 构建虚拟化平台工具软件包 yum 与 dnf Yum和DNF都是用于管理Linux系统中的软件包的工具&#xff0c;但它们在许多方面存在一些差异。以下是一些可能的区别&#xff1a; 依赖解…

Python爬虫某云免费音乐——多线程批量下载

重点一&#xff1a;每首音乐的下载地址 重点二&#xff1a;如何判断是免费音乐 重点三&#xff1a;如何用线程下载并保存 重点四&#xff1a;如何规避运行错误导致子线程死掉 重点五&#xff1a;如何管理子线程合理运行 需要全部代码的私信或者VX:Kmwcx1109 运行效果&…

通过阿里云仓库来下载docker镜像

本文的前提是你已经在你的centos中安装了docker。 Step1&#xff1a; 注册登录阿里云登录 - 欢迎登录阿里云&#xff0c;安全稳定的云计算服务平台注册一个阿里云&#xff08;直接用支付宝扫码就行&#xff09;。 Step2&#xff1a; 创建个人实例 ​ Step3&#xff1a; 进…

关于bypassuac的探究——bypass的实现

经过前面的探究过后&#xff0c;我们整理下思路&#xff0c;首先要创建注册表&#xff0c;并添加DelegateExecute这个键值对&#xff0c;并修改command的指向exe路径即可bypassuac&#xff0c;那么这里用到一下几个函数 RegCreateKeyExA 首先是创建注册表项&#xff0c;对应的…

书客、米家、柏曼大路灯哪款好?多维度实测对比推荐!

每到寒暑假&#xff0c;各个论坛上出现“大路灯怎么选”的类似话题非常频繁&#xff0c;因为现在的孩子出来上学期间需要读写之外&#xff0c;在寒暑假时也在不断的学习&#xff0c;许多家长关注到孩子学习时的光线问题&#xff0c;担心影响到孩子的视力状况&#xff0c;都纷纷…

如何获取时间戳

在JavaScript中&#xff0c;你可以使用Date对象来获取时间戳。以下是一个例子&#xff1a; javascriptvar timestamp new Date().getTime(); console.log(timestamp); 在这个例子中&#xff0c;new Date()创建了一个新的日期对象&#xff0c;.getTime()方法则返回自1970年1月…

突破编程_C++_面试(基础知识(1))

1 面试题1&#xff1a;static的用法 static 关键字可用于修饰全局函数和全局变量、函数的局部变量、类数据成员和类函数。 &#xff08;1&#xff09;修饰全局函数和全局变量&#xff1a;只能在本代码文件中使用。 &#xff08;2&#xff09;修饰函数的局部变量&#xff1a;有…

go语言-context的基本使用

1. 什么是 Context&#xff1f; Go 1.7 标准库引入 context&#xff0c;中文译作“上下文”&#xff0c;准确说它是 goroutine 的上下文&#xff0c;包含 goroutine 的运行状态、环境、现场等信息。 context 主要用来在 goroutine 之间传递上下文信息&#xff0c;包括&#x…

Backtrader 文档学习- Analyzers - Analyzers Reference(下)

Backtrader 文档学习- Analyzers - Analyzers Reference&#xff08;下&#xff09; 1.PeriodStats &#xff08;1&#xff09;定义 class backtrader.analyzers.PeriodStats() 时间段内基础统计信息 参数&#xff1a; timeframe (default: Years) &#xff0c;见前compres…