算法刷题笔记 合并集合(C++实现)

文章目录

    • 题目描述
    • 基本思路
    • 实现代码

题目描述

  • 一共有n个数,编号是1∼n,最开始每个数各自在一个集合中。
  • 现在要进行m个操作,操作共有两种:
    • M a b,将编号为ab的两个数所在的集合合并,如果两个数已经在同一个集合中,则忽略这个操作;
    • Q a b,询问编号为a和b的两个数是否在同一个集合中;

输入格式

  • 第一行输入整数nm
  • 接下来m行,每行包含一个操作指令,指令为M a bQ a b中的一种。

输出格式

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

数据范围

  • 1 ≤ n,m ≤ 10^5

基本思路

  • 并查集:并查集是本题使用的数据结构。这是一个常考的数据结构,其代码非常短,但是思路都很精巧。
  • 并查集的作用:快速将两个集合合并,以及判定两个元素是否属于同一个集合。这里的快速是指时间复杂度近乎O(1)
  • 基本原理:以一棵树的形式(不一定是二叉树)来维护一个集合,每一个集合的编号就是该集合的根节点的编号。树的每一个结点都存储该结点的父结点的位置。每次查询某个元素属于哪一个集合,只需要找到该元素对应的结点,然后一级一级向上查找父结点直到根结点即可。尽管已经有一定的优化,但是一直查找到树的根节点也需要进行遍历,所以有进一步的优化,即找到一个集合树的根节点后,该路径上的所有结点的父节点都会直接指向根结点。这种优化方法被称为路径压缩。
  • 判定是否是根节点:一个结点的父节点编号和结点本身相同。可以基于这个条件来一级一级向上查找。
  • 如何合并两个集合:将一个集合的树作为另一个集合树的根节点的一个子结点即可。
  • 按秩合并:并查集的另一种优化方法,但是优化效果不显著,使用情况较少,此处不再赘述。
  • find(x):这是并查集最常用的方法之一,作用是返回元素x所在的集合的编号。

实现代码

#include <iostream>
using namespace std;// sets中的每一个元素表示当前集合的根节点编号
const int N = 100010;
int sets[N];// 用于查找一个元素所属的集合编号的函数
int find_set(int x)
{// 对于非根结点,则查询其上方的一个结点,同时进行路径压缩if(sets[x] != x) sets[x] = find_set(sets[x]);else return sets[x];
}// 合并两个集合的函数,将第二个元素所属的集合作为第一个元素所属集合的叶子结点
inline void merge(int a, int b)
{// 首先通过find_set找到b元素所在集合的编号// 然后将该编号对应的根节点元素(与编号同号)的所属集合设置为a元素所在集合的编号sets[find_set(b)] = find_set(a);
}// 查询两个元素是否属于同一个集合的函数
inline void query(int a, int b)
{// 如果查询两个元素的集合编号相同,则属于同一个集合if(find_set(a) == find_set(b)) cout << "Yes" << endl;else cout << "No" << endl;
}int main(void)
{int n, m;cin >> n >> m;// 初始化集合for(int i = 1; i <= n; ++ i) sets[i] = i;// 进行合并和查询操作for(int i = 0; i < m; ++ i) {char operation;int a, b;cin >> operation >> a >> b;if(operation == 'M') merge(a, b);else if(operation == 'Q') query(a, b);}return 0;
}

注意事项

  • 本题代码中的核心是理解sets数组的含义。sets数组实际上存储的是每一个元素所属的集合编号,初始情况下每个元素的集合编号和自身的编号相同,即一一对应。
  • find_set函数中,如果当前元素不是某一个集合的根节点,那就将当前元素所属的集合更新为当前元素的集合的根节点所属的集合,即进行路径压缩。

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

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

相关文章

springboot健身房预约管理系统-计算机毕业设计源码75535

目录 1 绪论 1.1 选题背景与意义 1.2国内外研究现状 1.3论文结构与章节安排 2系统分析 2.1 可行性分析 2.1.1经济可行性 2.1.2技术可行性 2.1.3操作可行性 2.2 系统流程分析 2.2.1系统开发流程 2.2.2 用户登录流程 2.2.3 系统操作流程 2.2.4 添加信息流程 2.2.5 …

Gradle学习-6 APT 实现一个路由跳转框架(APT、发布maven仓库)

Annotation 注解&#xff1a;注解是元数据&#xff0c;即描述数据的数据APT&#xff08;Annotation Processing Tool&#xff09;注解处理器 APT工作原理 Demo介绍 APT项目地址 使用APT maven仓库地址 &#xff08;1&#xff09;项目配置 Gradle 8.2AGP 8.2.0Java jdk 17…

调整网络安全策略以适应不断升级的威胁形势

关键网络安全统计数据和趋势 当今数字时代网络安全的重要性

Tensor-LLM简单介绍

最近体验了一下英伟达的TensorRT-LLM的最新版本&#xff0c;写个简单介绍&#xff0c;给大家参考。 TensorRT-LLM是专门用于大语言模型推理和部署的产品&#xff0c;同类型产品还有来自UC-Berkley的vLLM,上海人工实验室的LMDeploy&#xff0c;英特尔的OpenVINO。 英特尔的Ope…

【工具推荐】高效查看日志利器:推荐使用uvviewsoft LogViewer

文章目录 高效查看日志利器&#xff1a;推荐使用uvviewsoft LogViewer什么是uvviewsoft LogViewer&#xff1f;主要功能 uvviewsoft LogViewer 的优势高性能强大的搜索与过滤功能友好的用户界面实时监控 下载和安装安装步骤 使用示例打开日志文件搜索日志内容过滤日志内容实时查…

Python爬虫速成之路(2):爬天气情况

hello hello~ &#xff0c;这里是绝命Coding——老白~&#x1f496;&#x1f496; &#xff0c;欢迎大家点赞&#x1f973;&#x1f973;关注&#x1f4a5;&#x1f4a5;收藏&#x1f339;&#x1f339;&#x1f339; &#x1f4a5;个人主页&#xff1a;绝命Coding-CSDN博客 &a…

nginx的四层负载均衡实战

目录 1 环境准备 1.1 mysql 部署 1.2 nginx 部署 1.3 关闭防火墙和selinux 2 nginx配置 2.1 修改nginx主配置文件 2.2 创建stream配置文件 2.3 重启nginx 3 测试四层代理是否轮循成功 3.1 远程链接通过代理服务器访问 3.2 动图演示 4 四层反向代理算法介绍 4.1 轮询&#xff0…

docker 上传镜像到hub仓库

要将 Docker 镜像上传到 Docker Hub&#xff0c;你需要按照以下步骤操作&#xff1a; 登录 Docker Hub 首先&#xff0c;你需要登录到 Docker Hub。打开终端并运行以下命令&#xff1a;docker login系统会提示你输入 Docker Hub 的用户名和密码。 如果密码忘记可以token登录&a…

MySQL复合查询(重点)

前面我们讲解的mysql表的查询都是对一张表进行查询&#xff0c;在实际开发中这远远不够。 基本查询回顾 查询工资高于500或岗位为MANAGER的雇员&#xff0c;同时还要满足他们的姓名首字母为大写的J mysql> select * from emp where (sal>500 or jobMANAGER) and ename l…

【数据结构初阶】详解 环形链表:链表的带环问题(判断是否带环、环形链表的入口点)

文章目录 一、链表的带环问题1.1、判断链表是否带环&#xff08;力扣 141.环形链表&#xff09;1.2 、证明&#xff1a;为什么带环时快慢指针一定相遇&#xff1f;1.3、证明&#xff1a;当slow走1步&#xff0c;fast可走3/4/5步&#xff08;fast的速度是slow的3/4/5倍&#xff…

Open3d入门 一文读懂三维点云

三维点云技术的发展始于20世纪60年代&#xff0c;随着激光雷达和三维扫描技术的进步&#xff0c;在建筑、考古、地理信息系统和制造等领域得到了广泛应用。20世纪90年代&#xff0c;随着计算机处理能力的提升&#xff0c;点云数据的采集和处理变得更加高效&#xff0c;推动了自…

【学习笔记】无人机(UAV)在3GPP系统中的增强支持(二)-支持高分辨率视频直播应用

引言 本文是3GPP TR 22.829 V17.1.0技术报告&#xff0c;专注于无人机&#xff08;UAV&#xff09;在3GPP系统中的增强支持。文章提出了多个无人机应用场景&#xff0c;分析了相应的能力要求&#xff0c;并建议了新的服务级别要求和关键性能指标&#xff08;KPIs&#xff09;。…

单体项目和微服务项目

“好的架构是演化出来的&#xff0c;不是设计出来的”。 微服务是用来处理海量数据、业务复杂和需求频繁变更场景下的架构风格。并不是万金油。 单体项目有哪些缺点&#xff1f; 1.不好扩展&#xff0c;即使只有一个组件需要扩展也需要扩展整个项目。 2.不好维护&#xff0c;屎…

在unity中的球形插值方法中第三个参数t是什么

在Unity中&#xff0c;球形插值&#xff08;Spherical Linear Interpolation&#xff0c;简称Slerp&#xff09;是一种用于在两个向量之间进行平滑插值的方法。球形插值通常用于旋转或方向的插值&#xff0c;以确保插值结果在球面上平滑过渡。 在Unity中&#xff0c;球形插值方…

【Vue3组件】LottieAnimation组件封装,用于流畅的页面动画效果

lottie是什么就不多介绍了&#xff0c;自己封装了一个平时用的比较多的组件&#xff0c;主要用于快速使用lottie动画&#xff0c;支持自动播放&#xff0c;循环播放&#xff0c;暂停继续 必要的库–lottie-web <template><div class"lottie" ref"lot…

【Rust】——不安全Rust

&#x1f4bb;博主现有专栏&#xff1a; C51单片机&#xff08;STC89C516&#xff09;&#xff0c;c语言&#xff0c;c&#xff0c;离散数学&#xff0c;算法设计与分析&#xff0c;数据结构&#xff0c;Python&#xff0c;Java基础&#xff0c;MySQL&#xff0c;linux&#xf…

【调试笔记-20240713-Windows-Tauri 多个HTML页面支持】

调试笔记-系列文章目录 调试笔记-20240713-Windows-Tauri 多个HTML页面支持 文章目录 调试笔记-系列文章目录调试笔记-20240713-Windows-Tauri 多个HTML页面支持 前言一、调试环境操作系统&#xff1a;Windows 10 专业版调试环境调试目标 二、调试步骤搜索相似问题 三、应用场…

FPGA入门-自用

写代码&#xff0c;并将引脚对应到板子相应的引脚上 下载程序到板子上 遇到错误了&#xff0c;不按想的来的了&#xff0c;进行仿真 查看网表图查看问题所在 简化了一些步骤&#xff1a;未使用引脚的设置&#xff0c;电压设置&#xff1b; 通过画网表结构图来构成电路 时钟 …

SpringBoot+Vue实现简单的文件上传(txt篇)

SpringBootVue实现简单的文件上传 1 环境 SpringBoot 3.2.1&#xff0c;Vue 2&#xff0c;ElementUI 2 页面 3 效果&#xff1a;只能上传txt文件且大小限制为2M&#xff0c;选择文件后自动上传。 4 前端代码 <template><div class"container"><el-…

Windows安装linux子系统

Windows安装linux子系统 步骤 1 - 启用适用于 Linux 的 Windows 子系统 需要先启用“适用于 Linux 的 Windows 子系统”可选功能&#xff0c;然后才能在 Windows 上安装 Linux 分发。 以管理员身份打开 PowerShell&#xff08;“开始”菜单 >“PowerShell” >单击右键 …