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

文章目录

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

算法思想

并查集的核心操作:

  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.hqwc.cn/news/444637.html

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

相关文章

【安装指南】nodejs下载、安装与配置详细教程

目录 &#x1f33c;一、概述 &#x1f340;二、下载node.js &#x1f337;三、安装node.js &#x1f341;四、配置node.js &#x1f33c;一、概述 Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行时&#xff0c;用于构建可扩展的网络应用程序。Node.js 使用事件驱动、…

新年新成员!OAK-T红外热成像仪预告!

编辑&#xff1a;OAK中国 首发&#xff1a;oakchina.cn 喜欢的话&#xff0c;请多多&#x1f44d;⭐️✍ 内容可能会不定期更新&#xff0c;官网内容都是最新的&#xff0c;请查看首发地址链接。 ▌前言 Hello&#xff0c;大家好&#xff0c;这里是OAK中国&#xff0c;我是Ash…

交通运输部铁路关基保护办法今起施行|附“空铁公水“关保图解

交通运输行业关乎国计民生&#xff0c;加快关基安全建设至关重要。关键信息基础设施是经济社会运行的神经中枢&#xff0c;是国家重要的战略资源&#xff0c;关系国家安全、国计民生和公共利益&#xff0c;具有基础性、支撑性、全局性作用&#xff0c;与此同时全球网络攻击范围…

AI论文指南|ChatGPT在论文讨论部分能起到什么作用?

点击下方▼▼▼▼链接直达AIPaperPass &#xff01; AIPaperPass - AI论文写作指导平台 公众号原文▼▼▼▼&#xff1a; AI论文指南|ChatGPT在论文讨论部分能起到什么作用&#xff1f; 讨论部分是一篇论文的精华所在&#xff0c;也是写作中最难的部分。讨论部分主要是将文章…

2024.2.1每日一题

LeetCode 今天看到一个评论挺有意思的&#xff0c;非常符合我现在的状况 简单题 – 稍加思索&#xff0c;嘴角上扬 中等题 – 认真对待&#xff0c;眉头一皱 困难题 – 绞尽脑汁&#xff0c;Ctrl cv 数字游戏 LCP 24. 数字游戏 - 力扣&#xff08;LeetCode&#xff09; 题目…

上岸秘籍来啦!TOGAF认证考试全攻略

上岸秘籍来啦&#xff01;手把手教你如何顺利通过TOGAF认证考试&#xff01; &#x1f31f;考试内容 TOGAF 9.2认证分为两个级别&#xff1a; ✅ TOGAF基础级&#xff1a;掌握标准术语、结构和基本概念&#xff0c;理解企业架构和核心标准。 ✅ TOGAF鉴定级&#xff1a;深入分析…

springboot139华强北商城二手手机管理系统

简介 【毕设源码推荐 javaweb 项目】基于springbootvue 的 适用于计算机类毕业设计&#xff0c;课程设计参考与学习用途。仅供学习参考&#xff0c; 不得用于商业或者非法用途&#xff0c;否则&#xff0c;一切后果请用户自负。 看运行截图看 第五章 第四章 获取资料方式 **项…

springboot+AOP+RBAC自定义权限访问控制03

springbootAOPRBAC自定义权限访问控制03&#xff01;今天我们做完了整个权限管理的内容。 内容比较多。请大家有足够的耐心看完。 首先。我们为了测试权限的鉴别效果&#xff0c;我们提前准备了一个新闻实体类&#xff0c;对应数据库的tb_news数据表。 我们提前准备好了新闻…

【AI绘画】Stable Diffusion扩散模型 + Consistency一致性模型 小白必看!!!!!

手把手教你入门绘图超强的AI绘画&#xff0c;用户只需要输入一段图片的文字描述&#xff0c;即可生成精美的绘画。给大家带来了全新保姆级教程资料包 &#xff08;文末可获取&#xff09; 1 GAN到Stable Diffusion的改朝换代2 从DDPM到Stable Diffusion发展史 2.1 DDPM 扩散过…

GNSS技术助力航海业迈向新时代:海洋测绘与航行的创新应用

全球导航卫星系统&#xff08;GNSS&#xff09;技术在海洋测绘与航行领域的广泛应用&#xff0c;正推动航海业迎来新一轮的科技变革。MinewSemi的GNSS模块为船舶导航、海洋资源勘探和航行安全提供了更为精确和高效的解决方案。本文将深入研究GNSS技术在海洋测绘与航行中的创新应…

代码随想录刷题第21天

第一题是二叉搜索树的最小绝对差&#xff0c;初始思路是中序遍历将二叉搜索树转换为有序数组&#xff0c;在有序数组中进行遍历。一遍过了。&#xff08;手机打代码真的麻烦&#xff09;看卡哥讲解会了双指针法遍历。 第二题是二叉搜索树中的众数&#xff0c;还是只想到了中序…

FPGA高端项目:Xilinx Artix7系列FPGA 多路视频缩放拼接 工程解决方案 提供4套工程源码+技术支持

目录 1、前言版本更新说明给读者的一封信FPGA就业高端项目培训计划免责声明 2、相关方案推荐我这里已有的FPGA图像缩放方案我已有的FPGA视频拼接叠加融合方案本方案的Xilinx Kintex7系列FPGA上的ov5640版本本方案的Xilinx Kintex7系列FPGA上的HDMI版本 3、设计思路框架设计框图…