编程奇境:C++之旅,从新手村到ACM/OI算法竞赛大门(中级武器:并查集)

我们都知道,朋友的朋友也可以是朋友,并查集就是这么一种武器,能够让自己广交天下之友。

并查集

并查集啊,想象一下你班上的同学们都在操场上自由活动。突然老师说:“大家找朋友手拉手围成圈玩个游戏!”这时候,每个同学就得赶紧找到其他同学牵手,形成一个个的小圈子。

一开始,可能有的同学很快就找到了朋友,两个人就形成了一个小小的圈子;有的同学可能慢一点,但他们最终也会找到别人,加入到已有的圈子或者和新找到的朋友形成新的圈子。在这个过程中,如果两个小圈子碰到了,他们就可以选择合并成一个更大的圈子。

并查集,就是在计算机里帮助我们管理这种“找朋友拉手组成圈子”的一种数据结构。它主要有两个任务:一个是“查询”(find),就是看看某个同学属于哪个圈子;另一个是“合并”(union),就是把两个圈子合在一起变成一个大圈子。

举个例子,假如你想要知道小明和小红是不是在一个圈子里玩,你就可以用并查集的“查询”功能,很快得出答案。如果小明和小红不在同一个圈子里,但你想让他们一起玩,就可以用“合并”功能,让他们的圈子连起来。

简单来说,并查集就像是一个班级里的“牵手管理员”,帮助我们知道谁和谁是一伙的,还能轻松地把不同的小组组合成更大的团队,特别适合处理一些需要不断合并和查询团体归属的问题。

举个栗子

第一行包含两个整数 𝑁,𝑀,表示共有 𝑁个元素和 𝑀个操作。

接下来 𝑀行,每行包含三个整数 𝑍𝑖,𝑋𝑖,𝑌𝑖​。

当 𝑍𝑖=1时,将 𝑋𝑖与 𝑌𝑖所在的集合合并。

当 𝑍𝑖=2 时,输出 𝑋𝑖与 𝑌𝑖是否在同一集合内,是的输出 Y ;否则输出 N 。

#include<iostream>
using namespace std;
int f[200005];
//并查集模板 
int find(int x)
{if (f[x] == x)//如果组长是自己 {return x;//直接返回 }f[x] = find(f[x]);//递归地找组长 return f[x];
}
void merge(int u, int v)//合并 
{f[v] = u;//把v这个组归到u这个组里 
}
int main()
{int n, m;cin >> n >> m;for (int i = 1; i <= n; i++){f[i] = i;//初始化 每个人的组长都是自己 }for (int i = 0; i < m; i++){int z;int x, y;cin >> z >> x >> y;int u = find(x);//寻找组长 int v = find(y);if (z == 1)//如果可以合并 {merge(u, v);}else if (z == 2)//查找 {if (find(x) == find(y)) {//看看是否是同一个组的 cout << "Y" << endl;}else{cout << "N" << endl;}}}return 0;
}

 应用场景

并查集这种数据结构虽然简单,但它在很多实际问题中非常有用,尤其擅长处理涉及分类、归属判断和动态集合合并的问题。以下是并查集的一些典型应用场景:

  1. 社交网络的朋友圈问题:在社交网络中,如果要判断两个人是否是朋友或者间接朋友(通过共同的朋友连接),可以使用并查集来高效地管理和查询这些关系。

  2. 图的连通性问题:在无向图中,判断两个顶点是否连通,或者统计连通分量的数量时,可以用并查集快速实现。

  3. 赛事安排问题:如果有比赛需要避免某些特定队伍在早期相遇(比如来自同一地区的队伍),可以通过构建并查集来确保不会安排这样的对阵。

  4. 文件系统管理:在操作系统中,用来管理文件和目录的层次结构,判断两个文件是否位于同一个目录下。

  5. 最小生成树算法中的 Cycle Detection(环检测):如Kruskal算法中,用于检测添加一条边是否会形成环。

  6. 游戏开发中的团队管理:在多人在线游戏中,快速合并和查询玩家的队伍状态。

  7. 文本处理中的名词消歧:在自然语言处理中,识别文本中的名词是否指代同一实体,有助于实现命名实体识别的优化。

  8. 网络路由问题:在网络设计中,确定数据包从源到目的地是否有可达路径,或者在路由表合并时避免循环。

并查集的高效之处在于它支持近乎常数时间的查询和合并操作,这使得它成为解决上述问题的有力工具。在很多情况下,通过巧妙地使用并查集,可以大大简化算法的设计和实现。

练习题

P3367 【模板】并查集 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

P1551 亲戚 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

P1111 修复公路 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

P1195 口袋的天空 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

P1396 营救 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

P1892 [BOI2003] 团伙 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

P1621 集合 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

P2294 [HNOI2005] 狡猾的商人 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

百看不如一练,只有实践才是进步最快的方式,更要独立思考,如果想不出来了就看题解,会有眼前一亮的感觉。好啦,今天就到这里吧。下一期再见,记得给专栏点个关注,明天接着来哦~

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

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

相关文章

SpringBoot配置第三方专业缓存技术Ehcache

Ehcache缓存技术 我们刚才是用Springboot提供的默认缓存技术 我们用的是simple 是一个内存级的缓存 我们接下来要使用专业的缓存技术了 Ehcache 是一个流行的开源 Java 分布式缓存&#xff0c;由 Terracotta 公司开发和维护。它提供了一个快速、可扩展、易于集成的内存缓存…

LeetCode 每日一题 2748. 美丽下标对的数目

Hey编程小伙伴们&#x1f44b;&#xff0c;今天我要带大家一起解锁力扣上的一道有趣题目—— 美丽下标对的数目 - 力扣 (LeetCode)。这不仅是一次编程挑战&#xff0c;更是一次深入理解欧几里得算法判断互质的绝佳机会&#xff01;&#x1f389; 问题简介 题目要求我们给定一…

如何制定适合不同行业的新版FMEA培训计划?

在快速变化的市场环境中&#xff0c;失效模式与影响分析&#xff08;FMEA&#xff09;作为一种预防性的质量控制工具&#xff0c;越来越受到企业的重视。然而&#xff0c;不同行业在FMEA应用上存在着明显的差异&#xff0c;因此制定适合不同行业的新版FMEA培训计划显得尤为重要…

Sui主网升级至V1.27.2版本

其他升级要点如下所示&#xff1a; 重点&#xff1a; #17245 增加了一个新的协议版本&#xff0c;并在开发网络上启用了Move枚举。 JSON-RPC #17245: 在返回的JSON-RPC结果中增加了对Move枚举值的支持。 GraphQL #17245: 增加了对Move枚举值和类型的支持。 CLI #179…

kubernetes node 节点管理

kubernetes node 节点管理 1 查看集群信息 kubectl cluster-info 2 查看节点信息 2.1 查看node信息 kubectl get nodes 2.2 查看node细致信息 kubectl get nodes -o wide 2.3 查看node描述详细信息 kubectl describe node <node-name> 2.4 查看节点资源使用情况…

明基的台灯值得入手吗?书客、柏曼真实横向测评对比

如今&#xff0c;近视问题在人群中愈发凸显&#xff0c;据2024年的最新统计数据揭示&#xff0c;我国儿童青少年的近视率已经飙升至惊人的52.7%。在学业日益繁重的背景下&#xff0c;学生们的视力健康成为了社会各界关注的焦点。近视不仅影响视力&#xff0c;还可能引发一系列严…

LeetCode80. 删除有序数组中的重复项 II题解

LeetCode80. 删除有序数组中的重复项 II题解 题目链接&#xff1a; https://leetcode.cn/problems/remove-duplicates-from-sorted-array-ii/ 题目描述&#xff1a; 给你一个有序数组 nums &#xff0c;请你 原地 删除重复出现的元素&#xff0c;使得出现次数超过两次的元素…

渲染农场深度解析:原理理解、配置要点与高效使用策略

许多设计领域的新手可能对“渲染农场”这一概念感到陌生。渲染农场是一种强大的计算资源集合&#xff0c;它通过高性能的CPU和GPU以及专业的渲染引擎&#xff0c;为设计项目提供必要的渲染支持。这种平台由多台计算机或渲染节点组成&#xff0c;形成一个分布式网络&#xff0c;…

从零基础到学完CCIE要多久?

思科认证的CCIE是网络工程师追求的顶级认证之一。 对于刚入门的初学者来说&#xff0c;从零基础到通过CCIE认证&#xff0c;这条路需要多长时间&#xff1f; 这个问题的答案因人而异&#xff0c;取决于多种因素。 这不仅是一个关于时间的问题&#xff0c;更是一个关于规划、学习…

操作系统真象还原:输入输出系统

第10章-输入输出系统 这是一个网站有所有小节的代码实现&#xff0c;同时也包含了Bochs等文件 10.1 同步机制–锁 10.1.1 排查GP异常&#xff0c;理解原子操作 线程调度工作的核心内容就是线程的上下文保护&#xff0b;上下文恢复 。 根本原因是访问公共资源需要多个操作&…

JAVA中的策略模式详解

策略模式&#xff1a;让算法选择更灵活 一、引言 在软件开发中&#xff0c;我们经常会遇到需要根据不同情况选择不同的算法来执行任务的场景。如果将这些算法直接硬编码在类中&#xff0c;会导致类的职责过多&#xff0c;不利于维护和扩展。为了解决这个问题&#xff0c;我们…

【教学类-64-04】20240619彩色鱼骨图(一)6.5*1CM 6根棒子720种

背景需求&#xff1a; 幼儿益智早教玩具❗️鱼骨拼图 - 小红书在家也能自制的木棒鱼骨拼图&#xff0c;你也收藏起来试一试吧。 #母婴育儿 #新手爸妈 #玩具 #宝宝玩具怎么选 #早教 #早教玩具 #幼儿早教 #益智早教 #玩具 #宝宝早教 #益智拼图 #宝宝拼图 #玩不腻的益智玩具 #儿童…

vscode插件开发之 - Treeview视图

一些测试类插件&#xff0c;往往需要加载测试文件&#xff0c;并执行这些测试文件。以playwright vscode为例&#xff0c;该插件可以显示目录下所有的测试文件。如下图所示&#xff0c;显示了tests目录下的所有xxx.spec.js文件&#xff0c;那么如何在vscode插件开发中显示TreeV…

[Python学习篇] Python公共操作

公共运算符 运算符描述支持的容器类型合并字符串、列表、元组*复制字符串、列表、元组in元素是否存在字符串、列表、元组、字典not in元素是否不存在字符串、列表、元组、字典 示例&#xff1a; 字符串 str1 ab str2 cd print(str1 str2) # abcd print(str1 * 3) # ab…

嵌入式中间件_4.嵌入式中间件的主要功能及典型产品

1.嵌入式中间件的主要功能 嵌入式中间件的主要作用是对嵌入式应用屏蔽底层操作系统的异构性。其常用功能有网络通信、存储管理和数据处理等。 &#xff08;1&#xff09;网络通信&#xff1a;嵌入式系统的网络通信中间件是实现整个系统的框架结构和基本的通信接口功能。嵌入式…

Go语言day1

下载go语言的安装程序&#xff1a; All releases - The Go Programming Language 配置go语言的环境变量&#xff1a; 写第一个go语言 在E:\go_workspace当前窗口使用cmd命令: 输入 go run test.go

炭熄卡顿、延迟高、联机报错的解决方法一览

炭熄在制作中巧妙地结合了程序随机生成的元素&#xff0c;为玩家呈现出了一个充满未知与惊险的开放世界&#xff0c;是一款独具匠心的中式民俗恐怖题材游戏。在这款游戏中&#xff0c;玩家将化身为一位意外闯入村子的青年&#xff0c;面对种种鬼怪、努力活下来。游戏将于6月24日…

分页插件结合collection标签后分页数量不准确的问题

问题1:不使用collection 聚合分页正确 简单列子 T_ATOM_DICT表有 idname1原子12原子23原子34原子45原子56原子6 T_ATOM_DICT_AUDIT_ROUTE表审核记录表有 idaudit1拒绝1通过4拒绝 我要显示那些原子审核了,我把两个表inner join 就是那些原子审核过了 idnameaudit1原子1拒绝…

iOS原生APP开发的技术难点

iOS原生APP开发的技术难点主要体现在以下几个方面&#xff0c;总而言之&#xff0c;iOS原生APP开发是一项技术难度较高的工作&#xff0c;需要开发者具备扎实的编程基础、丰富的开发经验和良好的学习能力。北京木奇移动技术有限公司&#xff0c;专业的软件外包开发公司&#xf…

10个典型的MySQL笔试题和面试题

提供10个典型的MySQL笔试题和面试题作为示例&#xff0c;并给出答案或解释。如果需要更多题目&#xff0c;可以根据这些示例进行扩展或参考相关文档。 1. MySQL是什么&#xff1f; 答案&#xff1a;MySQL是一个关系型数据库管理系统&#xff08;RDBMS&#xff09;&#xff0c…