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

文章目录

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

算法思想

并查集的核心操作:

  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…

【习题】三方库

判断题 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;就看不到…

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;都纷纷…

HTTP(Java web方向补充篇)

HTTP&#xff08;Java web方向补充篇&#xff09; HTTP简介 概念&#xff1a;Hyper Text Transfer Protocol,超文本传输协议&#xff0c;规定了浏览器和服务器之间数据传输的规则 HTTP协议特点&#xff1a; 基于TCP协议&#xff1a;面向连接&#xff0c;安全基于请求-响应模…

如何有效获取 Go 变量类型?探索多种方法

嗨&#xff0c;大家好&#xff01;本文是系列文章 Go 小技巧第九篇&#xff0c;系列文章查看&#xff1a;Go 语言小技巧。 文章目录 Go 的类型系统类型获取使用 fmt.Printf类型选择类型选择反射 reflect.TypeOf 其他注意点错误处理性能考量 总结 在 Python 中&#xff0c;可以使…

freertos 源码分析二 list链表源码

list.c 一、链表初始化 void vListInitialise( List_t * const pxList ) { pxList->pxIndex ( ListItem_t * ) &…

求n的k次方

递归法&#xff1a; #include<stdio.h> int mi(int n, int k) {if (k 1) //如果是1次方{return n; //返回n的1次方&#xff08;也就是n&#xff09;}else{return n * mi(n, k - 1); //n*n的k-1次方} } int main() {int n 0, k 0, sum 0;printf("请输入n值…

【Spark实践6】特征转换FeatureTransformers实践Scala版--补充算子

本节介绍了用于处理特征的算法&#xff0c;大致可以分为以下几组&#xff1a; 提取&#xff08;Extraction&#xff09;&#xff1a;从“原始”数据中提取特征。转换&#xff08;Transformation&#xff09;&#xff1a;缩放、转换或修改特征。选择&#xff08;Selection&…

Day02-数据类型和运算符(基本数据类型转换,赋值运算符,算术运算符,关系运算符,逻辑运算符,条件运算符,位运算符,赋值运算符,运算符优先级,标点符号)

文章目录 Java基础语法学习目标1 基本数据类型转换&#xff08;Conversion&#xff09;&#xff08;掌握&#xff09;1.1 自动类型转换&#xff08;隐式类型转换&#xff09;1.2 强制类型转换&#xff08;显式类型转换&#xff09;1.3 基本数据类型与字符串类型的转换 2 运算符…