836. 合并集合(acwing)

文章目录

  • 836. 合并集合
    • 题目描述
    • 并查集
      • acwing并查集模板

836. 合并集合

题目描述

一共有 n 个数,编号是 1∼n,最开始每个数各自在一个集合中。

现在要进行 m 个操作,操作共有两种:

  1. M a b,将编号为 a 和 b 的两个数所在的集合合并,如果两个数已经在同一个集合中,则忽略这个操作;
  2. Q a b,询问编号为 a 和 b 的两个数是否在同一个集合中;

输入格式
第一行输入整数 n 和 m。

接下来 m 行,每行包含一个操作指令,指令为 M a bQ a b 中的一种。

输出格式
对于每个询问指令 Q a b,都要输出一个结果,如果 a 和 b 在同一集合内,则输出 Yes,否则输出 No。

每个结果占一行。

数据范围

1≤n,m≤105

输入样例:

4 5
M 1 2
M 3 4
Q 1 2
Q 1 3
Q 3 4

输出样例:

Yes
No
Yes

并查集

对并查集算法不太了解的可以看我这篇博客:并查集算法

这段代码是一个使用并查集(disjoint set union, DSU)算法实现的集合合并查询系统。并查集是一种数据结构,它提供了两个主要功能:找到某个元素所在的集合的代表元素(find),以及合并两个元素所在的集合(union)。

#include<bits/stdc++.h> // 引入常用头文件
using namespace std;const int z=1e5+10; // 定义常量z为100010,用于数组fa的大小,略大于题目中的数据范围1≤n≤10^5int fa[z]; // 定义数组fa,fa[i]表示编号为i的元素的父节点,初始化时每个元素的父节点是它自己// find函数,用于找到i的根节点(代表元素)
int find(int i)
{// 如果i的父节点是它自己,说明i就是根节点if(fa[i]==i)return i;else{// 否则,递归地找到i的根节点,并进行路径压缩fa[i]=find(fa[i]);return fa[i];}
}// unionn函数,用于合并i和j所在的集合
void unionn(int i,int j)
{int i_fa=find(i); // 找到i的根节点int j_fa=find(j); // 找到j的根节点// 将i的根节点的父节点设置为j的根节点,实现合并fa[i_fa]=j_fa;
}int main()
{int n,m; // n表示元素个数,m表示操作次数cin>>n>>m; // 读入n和mfor(int i=1;i<=n;i++) // 初始化fa数组,使每个元素的父节点是它自己fa[i]=i;char op[2]; // 定义字符数组op用于存储操作符while(m--) // 循环读入m个操作{char op; // 重新定义op变量用于存储当前操作符int a,b; // a和b用于存储操作的两个数cin>>op>>a>>b; // 读入操作符和操作数if(op=='M') // 如果操作是'M',执行合并操作unionn(a,b);else // 如果操作是'Q',执行查询操作{// 如果a和b的根节点相同,输出"Yes",表示a和b在同一集合中if(find(a)==find(b)) cout<<"Yes"<<endl;else cout<<"No"<<endl; // 否则,输出"No"}}return 0;
}

这个代码实现了并查集的基本操作,并应用于解决了一个动态集合合并和查询问题。通过递归的find函数实现了路径压缩,提高了查找根节点的效率。union函数通过修改父节点指针来合并两个集合。主函数中通过读入操作,利用这两个函数处理合并和查询请求,最后输出每次查询的结果。

acwing并查集模板

这段代码实现了一个简单的并查集(Union-Find)数据结构应用,用于处理集合的合并(M)和查询(Q)操作。并查集是一种数据结构,主要用于处理一些不交集的合并及查询问题。其核心思想是通过每个节点指向其父节点,从而形成一个树结构来表示一个集合。树的根节点代表了整个集合,通过路径压缩等技术可以高效地进行查找和合并操作。

#include<bits/stdc++.h> // 包含STL库
using namespace std;const int N=100010; // 预定义大小,足够容纳题目中的最大数据量
int u[N]; // u数组用于表示每个元素的父节点// find函数用于找到x的根节点,实现路径压缩
int find(int x) {if(x!=u[x]) u[x]=find(u[x]); // 如果x不是根节点,递归地找到根节点,并进行路径压缩return u[x]; // 返回根节点
}int main() {int n,m; // n代表元素个数,m代表操作次数cin>>n>>m; // 输入n和mfor(int i=1;i<=n;i++) u[i]=i; // 初始化,每个元素自成一集合,父节点指向自己char op; // 操作类型,'M'或'Q'int a,b; // 操作涉及的元素while(m--) { // 循环处理所有操作cin>>op>>a>>b; // 输入操作和操作数if(op=='M') {// 如果是合并操作,将a的根节点的父节点设置为b的根节点// 从而实现两个集合的合并u[find(a)]=find(b);} else {// 如果是查询操作if(find(a)==find(b)) cout<<"Yes\n"; // 如果a和b有相同的根节点,则它们在同一个集合中else cout<<"No\n"; // 否则,不在同一个集合中}}return 0;
}

这段代码的关键在于高效地实现查找和合并操作。查找操作通过递归实现路径压缩,即在查找根节点的过程中,将路径上的每个节点直接连接到根节点,从而减少后续查找的时间。合并操作简单直接,只需要将一个集合的根节点指向另一个集合的根节点。查询操作则是通过比较两个元素的根节点是否相同来判断它们是否属于同一个集合。

这样的实现保证了在几乎所有情况下的高效性,使并查集成为处理动态连通性问题的有力工具。

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

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

相关文章

Python与C++的对比——跟老吕学Python编程

Python与C的对比——跟老吕学Python编程 Python与C的对比1.C编译型 vs Python解释型2.执行效率3.开发效率4.跨平台5.可移植性6.内存管理机制7.易学性8.静态类型 vs 动态类型9.面向对象编程概念10.垃圾回收11.应用领域 Python与C的对比表 Python与C的对比 Python和C都是最受欢迎…

数据结构小记【Python/C++版】——散列表篇

一&#xff0c;基础概念 散列表&#xff0c;英文名是hash table&#xff0c;又叫哈希表。 散列表通常使用顺序表来存储集合元素&#xff0c;集合元素以一种很分散的分布方式存储在顺序表中。 散列表是一个键值对(key-item)的组合&#xff0c;由键(key)和元素值(item)组成。键…

解密阿里巴巴面试题:如何设计一个微博?

亲爱的小米科技粉丝们,大家好呀!今天小米带来了一则热门话题——阿里巴巴面试题:如何设计一个微博?别着急,跟着小米一起来揭秘吧! 实现哪些功能? 在设计微博系统时,需要考虑实现哪些功能才能满足用户的需求。除了基本的发布推文、时间线、新闻推送、关注/不允许用户以…

编程训练基础代码六

1、定义一个方法&#xff0c;该方法能够找出两个小数中的较小值并返回。 public class SmallerValue {public static void main(String[] args) {Scanner sc new Scanner(System.in);System.out.println("请输入两个整数: ");int asc.nextInt();int bsc.nextInt();…

算法 -【找出字符串的可整除数组】

找出字符串的可整除数组 题目示例1示例2 分析代码 题目 给你一个下标从 0 开始的字符串 word &#xff0c;长度为 n &#xff0c;由从 0 到 9 的数字组成。另给你一个正整数 m 。word 的可整除数组 div 是一个长度为 n 的整数数组&#xff0c;并满足&#xff1a; 如果 word[0…

【JavaScript 漫游】【034】AJAX

文章简介 本篇文章为【JavaScript 漫游】专栏的第 034 篇文章&#xff0c;对浏览器模型的 XMLHttpRequest 对象&#xff08;AJAX&#xff09;的知识点进行了总结。 XMLHttpRequest 对象概述 浏览器与服务器之间&#xff0c;采用 HTTP 协议通信。用户在浏览器地址栏键入一个网…

Java项目源码基于springboot的家政服务平台的设计与实现

大家好我是程序员阿存&#xff0c;在java圈的辛苦码农。辛辛苦苦板砖&#xff0c;今天要和大家聊的是一款Java项目源码基于springboot的家政服务平台的设计与实现&#xff0c;项目源码以及部署相关请联系存哥&#xff0c;文末附上联系信息 。 项目源码&#xff1a;Java基于spr…

虚拟机镜像iso下载

MSDN, 我告诉你 - 做一个安静的工具站 (itellyou.cn)

CANalyzer使用_00 概述

计划写一个专题&#xff0c;该专题主要介绍CANalyzer的使用&#xff0c;每次文档计划写一个点&#xff0c;自己不累&#xff0c;别人看着也不累&#xff0c;并且方便拓展。本文作为专题的开篇主要介绍下CANalyzer软件的背景&#xff0c;软件界面等信息。 1 软件介绍 CANalyze…

FastAPI 学习笔记

FastAPI 学习笔记 0. 引言1. 快速开始2. 升级示例代码 0. 引言 在 Python 这个充满活力的生态系统中&#xff0c;FastAPI 应运而生&#xff0c;它是一个现代的、快速的 Web 框架&#xff0c;专注于构建 RESTful API。 无论你是一名有经验的 Python 开发人员&#xff0c;还是一…

MyBatis注解开发详解

MyBatis注解开发详解 一、前言 MyBatis是一个优秀的持久层框架&#xff0c;它支持定制化SQL、存储过程以及高级映射。MyBatis免除了几乎所有的JDBC代码和手动设置参数以及获取结果集。MyBatis可以使用简单的XML或注解来配置和映射原始类型、接口和Java POJO&#xff08;Plain…

HTTP/2、HTTP/3对HTTP/1.1的性能改进和优化

HTTP/1.1 相比 HTTP/1.0 提高了什么性能&#xff1f; 性能上的改进&#xff1a; 使用长连接的方式改善了 HTTP/1.0 短连接造成的性能开销。 支持管道&#xff08;pipeline&#xff09;网络传输&#xff0c;只要第一个请求发出去了&#xff0c;不必等其回来&#xff0c;就可以…

Purple Pi OH鸿蒙开发板7天入门OpenHarmony开源鸿蒙教程【五】

在完成了Purple Pi OH大部分的接口测试之后&#xff0c;紧接着就是一个充满挑战的任务——利用SDK来编译生成我们自己的镜像文件。通过这一过程&#xff0c;不仅能够让你获得一个可在真实硬件上运行的系统镜像&#xff0c;更重要的是&#xff0c;它让你对OpenHarmony系统的构建…

C++中的内存管理方式

一、C内存管理方式简介 C语言中的内存管理方式在C中可以继续使用&#xff0c;但是在有些地方就无能为力&#xff0c;而且使用起来比较麻烦。因此C中引入了自己的内存管理方式&#xff0c;通过new和delete操作符进行动态内存管理。 二、new语法 new可以申请1个或多个空间&…

Android自定义binder实现进程间通信

通过binder建立进程间通信&#xff0c;主要分为两步&#xff1a; 1. 定义一个binder的服务&#xff08;在androidManifest.xml中声明&#xff09;接受远端请求。 服务中创建一个binder实例&#xff0c; 在接收到客户端的连接时&#xff0c;向请求方返回回binder的引用。重写Bi…

Qt - 信号和槽

目录 一、信号 二、槽 三、信号和槽的使用 (一) 连接信号和槽 (二) 自定义槽 (三) 通过 Qt Creator生成信号槽代码 (四) 自定义信号 四、带参数的信号和槽 五、信号与槽的断开 六、Qt4版本信号与槽的连接 (一) Qt4版本信号与槽连接的优缺点 一、信号 在 Qt 中&…

【简单模拟】第十二届蓝桥杯省赛第二场C++ B组《特殊年份》(C++)

【题目描述】 今年是 2021 年&#xff0c;2021 这个数字非常特殊&#xff0c;它的千位和十位相等&#xff0c;个位比百位大 1&#xff0c;我们称满足这样条件的年份为特殊年份。 输入 5 个年份&#xff0c;请计算这里面有多少个特殊年份。 【输入格式】 输入 5 行&#xff…

​Ubuntu20.04 创建新的用户​

1、了解Linux目录结构 推荐看一下&#xff1a;https://www.runoob.com/linux/linux-system-contents.html Linux支持多个用户进行操作的&#xff0c;这样提高了系统的安全性&#xff0c;也可以多人共用一个系统&#xff0c;不过要注意的是系统中安装的软件相关路径&#xff0…

CubeMX使用教程(5)——定时器PWM输出

本篇我们将利用CubeMX产生频率固定、占空比可调的两路PWM信号输出 例如PA6引脚输出100Hz的PWM&#xff1b;PA7引脚输出500Hz的PWM&#xff0c;双路同时输出 我们还是利用上一章定时器中断的工程进行学习&#xff0c;这样比较方便 首先打开CubeMX对PA6、PA7进行GPIO配置 注&a…

Mixamo动画素材导入UE5的最简单方法

一、Mixamo素材 官网&#xff1a;https://www.mixamo.com/ Mixamo是Adobe公司出品的免费动画库&#xff0c;可商用。软件分为characters(角色&#xff09;、Animations&#xff08;动画)两个部分。 二、辅助工具MIXAMO CONVERTER 官网&#xff1a;https://terribilisstudio…