当前位置: 首页 > news >正文

并查集(蓝桥杯 C++ 题目 代码 注解)

目录

介绍:

模板:

题目一(合根植物):

代码:

题目二(蓝桥幼儿园): 

代码:

题目三(小猪存钱罐):

代码:

题目四(星球大战):

代码:​​​​​​​

介绍:

并查集(Disjoint-set Data Structure),也称为不相交集合数据结构,用于解决集合的合并与查询问题。

并查集主要支持两个操作:
1. 合并(Union):将两个不相交的集合合并成一个集合。
2. 查询(Find):查询元素所在的集合。

并查集可以用于解决一些集合相关的问题,例如判断两个元素是否属于同一个集合,求集合中的元素个数等。

并查集的实现通常使用数组和树结构。数组表示每个元素的父节点,树结构表示集合的层次结构。在进行查找操作时,通过递归或迭代找到根节点;在进行合并操作时,将一个集合的根节点连接到另一个集合的根节点上。

并查集的时间复杂度主要取决于合并和查询操作的路径长度,通常可以达到近似常数时间复杂度。

例如,假设有5个元素分别为1、2、3、4、5,初始时每个元素都是一个单独的集合:
[1, 2, 3, 4, 5]

执行合并操作:将元素1和元素2合并
[2, 2, 3, 4, 5]

执行合并操作:将元素2和元素3合并
[2, 2, 2, 4, 5]

执行查询操作:查询元素1所在的集合
2

执行查询操作:查询元素4所在的集合
4

并查集是一种简单且高效的数据结构,可以在解决某些集合问题时提供方便和效率。

模板:

int find(int x)//查找
{if (f[x] == x) return x;return f[x] = find(f[x]);
}
void merge(int x, int y) //合并
{x = find(x), y = find(y);if (x != y)f[x] = f[y];
}

题目一(合根植物):

代码:

#include<iostream>
using namespace std;
int f[1000010];
int find(int k)//查询父亲
{if (f[k] == k)return k;else{f[k] = find(f[k]);return f[k];}
}
void merge(int a, int b)//合并
int main()
{int n, m;cin >> n >> m;for (int i = 1; i <= n * m; i++)//初始化{f[i] = i;}int k;cin >> k;while (k--){int a, b;cin >> a >> b;merge(a, b);//合并}long long ans=0;for (int i = 1; i <= n * m; i++){if (f[i] == i)//父亲为自己则为一个集合的代表ans++;}cout << ans;
}

题目二(蓝桥幼儿园): 

代码:

#include<iostream>
using namespace std;
int n,m;
int f[200100];
int find(int x)//查找
{if(f[x]==x)return x;return f[x]=find(f[x]);
}
void merge(int x,int y)//合并
{x=find(x),y=find(y);if(x!=y)f[x]=f[y];
}
int main()
{cin>>n>>m;for(int i=1;i<=n;i++)//初始为自己f[i]=i;while(m--){int x,y,z;cin>>z>>x>>y;if(z==1)//操作一合并{merge(x,y);}else//操作二{if(find(x)==find(y))cout<<"YES"<<endl;elsecout<<"NO"<<endl;}}
}

题目三(小猪存钱罐):

代码:

#include <iostream>//实际上就是几个连通分支
using namespace std;
int n,ans=0;
int f[1001000];
int find(int x)//查找
{if (f[x] == x) return x;return f[x] = find(f[x]);
}
void merge(int x, int y) //合并
{x = find(x),y = find(y);if (x != y) f[x] = f[y];
}
int main()
{cin>>n;for(int i=1;i<=n;i++)f[i]=i;for(int i=1;i<=n;i++){int x;cin>>x;merge(x,i);}for(int i=1;i<=n;i++){if(f[i]==i)//有一样的则为一个集合里的ans++;}cout<<ans;
}

题目四(星球大战):

代码:

#include<iostream>
#include<vector>
using namespace std;
int n, f[500100], ans[500100], m, k,cnt=0;
vector<int> e[500100];
int destroys[500100];
int broken[500100];
int find(int x)//查找
{if (f[x] == x) return x;return f[x] = find(f[x]);
}
void merge(int x, int y) //合并
{x = find(x),y = find(y);if (x != y) f[x] = f[y];
}
int main()
{cin >> n >> m;while (m--){int x, y;cin >> x >> y;e[x].push_back(y), e[y].push_back(x);}cin >> k;for (int i = 0; i < k; i++){cin >> destroys[i];broken[destroys[i]] = 1;//标记为摧毁}for (int i = 0; i < n; i++)//初始化父亲点为自身f[i] = i;for (int i = 0; i < n; i++){if (broken[i])//被摧毁则跳过continue;for (int j = 0; j < e[i].size(); j++)//遍历i点相连的边{int tmp = e[i][j];//相邻的点if (broken[tmp])//被摧毁跳过continue;merge(i, tmp);//合并两点为同一连通块}}for (int i = 0; i < n; i++)//遍历所有城市,先找到所有摧毁完后的连通块数if (!broken[i] && find(i) == i)//该城市没被摧毁且不是自身为父亲节点cnt++;for (int i = k - 1; i >= 0; i--)//从后往前修复道路{ans[i] = cnt;//记录该城市还没被修复时的连通块数量broken[destroys[i]] = 0;//修复该点cnt++;//修复该点,可以成为一个独立的连通分支for (int j = 0; j < e[destroys[i]].size();j++)//遍历该摧毁点的相连边{int v = e[destroys[i]][j];//相邻的点if (!broken[v] && find(v) != find(destroys[i]))//该城市没被摧毁且二者之前不属于同一连通块{merge(v, destroys[i]), cnt--;//因为原本相连,其实二者为同一连通块,合并二者且连通数减一}}}cout << cnt << endl;//完整时的连通块数量for (int i=0;i<k;i++)cout << ans[i] << endl;}

相关文章:

并查集(蓝桥杯 C++ 题目 代码 注解)

目录 介绍&#xff1a; 模板&#xff1a; 题目一&#xff08;合根植物&#xff09;&#xff1a; 代码&#xff1a; 题目二&#xff08;蓝桥幼儿园&#xff09;&#xff1a; 代码&#xff1a; 题目三&#xff08;小猪存钱罐&#xff09;&#xff1a; 代码&#xff1a; …...

MapReduce内存参数自动推断

MapReduce内存参数自动推断。在Hadoop 2.0中&#xff0c;为MapReduce作业设置内存参数非常繁琐&#xff0c;涉及到两个参数&#xff1a;mapreduce.{map,reduce}.memory.mb和mapreduce.{map,reduce}.java.opts&#xff0c;一旦设置不合理&#xff0c;则会使得内存资源浪费严重&a…...

pyside6 pytq PyDracula QVideoWidget视频只有画面没有声音

解决方案&#xff1a; 先不使用框架&#xff0c;纯pyside6代码&#xff0c;如果添加视频有画面有声音&#xff0c;那可以排除是硬件问题&#xff0c;如果没有画面只有声音&#xff0c;可能是视频解码器无法解码&#xff0c;换个格式的视频文件如果只有使用PyDracula 出问题&am…...

Axure基础 各元件的作用及介绍

图像热区 增加按钮或者文本的点击区域&#xff0c;他是透明的&#xff0c;在预览时看不见。 动态面板 用来绘制一下带交互效果的元件&#xff0c;他是动态的&#xff0c;如轮播图&#xff0c;一个动态面板里可以有多个子面板&#xff0c;每一个子面板对应着不同的效果。 他…...

学习Java的第六天

目录 一、变量 1、变量的定义 2、变量的声明格式 3、变量的注意事项 4、变量的作用域 二、常量 三、命名规范 Java 语言支持如下运算符&#xff1a; 1、算术运算符 解析图&#xff1a; 示例&#xff1a; 2、赋值运算符 解析图&#xff1a; 示例&#xff1a; 3、关…...

基于Spring Boot+ Vue的房屋租赁系统

末尾获取源码作者介绍&#xff1a;大家好&#xff0c;我是墨韵&#xff0c;本人4年开发经验&#xff0c;专注定制项目开发 更多项目&#xff1a;CSDN主页YAML墨韵 学如逆水行舟&#xff0c;不进则退。学习如赶路&#xff0c;不能慢一步。 目录 一、项目简介 二、开发技术与环…...

多轨迹建模方法的介绍与实操-基于R语言

本文介绍了多轨迹建模方法&#xff08;Group-Based Multivariate Trajectory Modeling&#xff09;&#xff0c;这是一种扩展了单指标组基轨迹建模的技术&#xff0c;用于分析多个疾病生物标志物或临床重要因素的联合轨迹&#xff0c;以更好地理解和追踪疾病进程、行为或健康状…...

【Spring】Spring状态机

1.什么是状态机 (1). 什么是状态 先来解释什么是“状态”&#xff08; State &#xff09;。现实事物是有不同状态的&#xff0c;例如一个自动门&#xff0c;就有 open 和 closed 两种状态。我们通常所说的状态机是有限状态机&#xff0c;也就是被描述的事物的状态的数量是有…...

Node.js基础---使用Express写接口

1. 创建基本的服务器 2. 创建 API 路由模块 // aoiRouter.js 路由模块 const express require(express) const apiRouter express.Router()module.exports apiRouter// ------------------------------------------// app.js 导入并注册路由模块 const apiRouter require(…...

小蓝的钥匙(蓝桥杯错排)

现在有28个小朋友&#xff0c;每个人手上有一把钥匙&#xff0c;每一个钥匙都只能打开自己的房间门&#xff0c;现在将所有钥匙都收上来&#xff0c;然后再随机打乱分给每个小朋友&#xff0c;也就是有28&#xff01;的分法&#xff0c;请问现在其中14个小朋友的钥匙能恰好打开…...

【Python】科研代码学习:八 FineTune PretrainedModel (用 trainer,用 script);LLM文本生成

【Python】科研代码学习&#xff1a;八 FineTune PretrainedModel [用 trainer&#xff0c;用 script] LLM文本生成 自己整理的 HF 库的核心关系图用 trainer 来微调一个预训练模型用 script 来做训练任务使用 LLM 做生成任务可能犯的错误&#xff0c;以及解决措施 自己整理的 …...

SpringBoot RestTemplate远程调用总结

1、get请求 GetMapping("/searchEntryRecordPageList") public JSONObject searchEntryRecordPageList(RequestParam Map<String,Object> params){HttpHeaders requestHeaders new HttpHeaders();requestHeaders.add("Authorization","Bearer…...

Python 强大邮件处理库 Imbox

目录 IMAP Mailbox Imbox 安装 特性 提取邮件内容 处理附件 安全性 示例 1&#xff1a;读取收件箱中的邮件 2&#xff1a;搜索并下载附件 3&#xff1a;连接到IMAP服务器获取所有邮件 结论 IMAP Mailbox IMAP&#xff08;Internet Message Access Protocol&#x…...

ElasticSearch深度分页问题如何解决

文章目录 概述解决方法深度分页方式from size深度分页之scrollsearch_after 三种分页方式比较 概述 Elasticsearch 的深度分页问题是指在大数据集上进行大量分页查询时可能导致的性能下降和资源消耗增加的情况。这种情况通常发生在需要访问大量数据的情形下&#xff0c;比如用…...

景安空间不支持指定运行目录tp5

/WEB/public/.htaccess配置 <IfModule mod_rewrite.c> Options FollowSymlinks -Multiviews RewriteEngine on RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^(.*)$ index.php?s$1 [QSA,PT,L] </IfModule>. 2./WEB/.ht…...

开放式高实时高性能PLC控制器解决方案-基于米尔电子STM32MP135

前言 随着工业数字化进程加速与IT/OT深入融合&#xff0c;不断增加的OT核心数据已经逐步成为工业自动化行业的核心资产&#xff0c;而OT层数据具备高实时、高精度、冗余度高、数据量大等等特点&#xff0c;如何获取更加精准的OT数据对数字化进程起到至关重要的作用&#xff0c;…...

【MySQL】-MVCC多版本并发控制

1、当前读 select 不加锁状态&#xff0c;当前读快照读 2、快照读 在select加锁下&#xff0c;读取数据后&#xff0c;形成快照。每个事务都会形成自己的快照内容 SELECT * FROM xx_table LOCK IN SHARE MODE;SELECT * FROM xx_table FOR UPDATE;INSERT INTO xx_table ...D…...

mangoDB:2024安装

mangoDB:2024安装 mangoDB: 下载链接 取消勾选 配置环境变量 启动服务 同级目录下创建一个db文件夹 然后执行命令&#xff0c;启动服务 mongod --dbpath D:\environment\mango\db访问http://localhost:27017/ 出现下面的就是安装成功 2然后在管理员权限下给mango服务重…...

微服务day06-Docker

Docker 大型项目组件较多&#xff0c;运行环境也较为复杂&#xff0c;部署时会碰到一些问题&#xff1a; 依赖关系复杂&#xff0c;容易出现兼容性问题 开发、测试、生产环境有差异 1.什么是Docker? 大型项目组件很多&#xff0c;运行环境复杂&#xff0c;部署时会遇到各种…...

喜马拉雅后端一面

1.自我介绍 2.项目拷打 2.1 为什么要用分布式锁&#xff1f; 2.2 用唯一索引能不能保证一人一单&#xff0c;和你的分布式锁比起来怎么用&#xff1f; 2.3 分布式锁是在事务开启前加还是事务开始后 2.4 讲讲你的布隆过滤器是怎么自定义实现的 2.5 讲讲你的Redis和数据库的数据一…...

(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)

题目&#xff1a;3442. 奇偶频次间的最大差值 I 思路 &#xff1a;哈希&#xff0c;时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况&#xff0c;哈希表这里用数组即可实现。 C版本&#xff1a; class Solution { public:int maxDifference(string s) {int a[26]…...

微信小程序之bind和catch

这两个呢&#xff0c;都是绑定事件用的&#xff0c;具体使用有些小区别。 官方文档&#xff1a; 事件冒泡处理不同 bind&#xff1a;绑定的事件会向上冒泡&#xff0c;即触发当前组件的事件后&#xff0c;还会继续触发父组件的相同事件。例如&#xff0c;有一个子视图绑定了b…...

大话软工笔记—需求分析概述

需求分析&#xff0c;就是要对需求调研收集到的资料信息逐个地进行拆分、研究&#xff0c;从大量的不确定“需求”中确定出哪些需求最终要转换为确定的“功能需求”。 需求分析的作用非常重要&#xff0c;后续设计的依据主要来自于需求分析的成果&#xff0c;包括: 项目的目的…...

前端导出带有合并单元格的列表

// 导出async function exportExcel(fileName "共识调整.xlsx") {// 所有数据const exportData await getAllMainData();// 表头内容let fitstTitleList [];const secondTitleList [];allColumns.value.forEach(column > {if (!column.children) {fitstTitleL…...

电脑插入多块移动硬盘后经常出现卡顿和蓝屏

当电脑在插入多块移动硬盘后频繁出现卡顿和蓝屏问题时&#xff0c;可能涉及硬件资源冲突、驱动兼容性、供电不足或系统设置等多方面原因。以下是逐步排查和解决方案&#xff1a; 1. 检查电源供电问题 问题原因&#xff1a;多块移动硬盘同时运行可能导致USB接口供电不足&#x…...

Linux云原生安全:零信任架构与机密计算

Linux云原生安全&#xff1a;零信任架构与机密计算 构建坚不可摧的云原生防御体系 引言&#xff1a;云原生安全的范式革命 随着云原生技术的普及&#xff0c;安全边界正在从传统的网络边界向工作负载内部转移。Gartner预测&#xff0c;到2025年&#xff0c;零信任架构将成为超…...

RNN避坑指南:从数学推导到LSTM/GRU工业级部署实战流程

本文较长&#xff0c;建议点赞收藏&#xff0c;以免遗失。更多AI大模型应用开发学习视频及资料&#xff0c;尽在聚客AI学院。 本文全面剖析RNN核心原理&#xff0c;深入讲解梯度消失/爆炸问题&#xff0c;并通过LSTM/GRU结构实现解决方案&#xff0c;提供时间序列预测和文本生成…...

Java多线程实现之Thread类深度解析

Java多线程实现之Thread类深度解析 一、多线程基础概念1.1 什么是线程1.2 多线程的优势1.3 Java多线程模型 二、Thread类的基本结构与构造函数2.1 Thread类的继承关系2.2 构造函数 三、创建和启动线程3.1 继承Thread类创建线程3.2 实现Runnable接口创建线程 四、Thread类的核心…...

Linux --进程控制

本文从以下五个方面来初步认识进程控制&#xff1a; 目录 进程创建 进程终止 进程等待 进程替换 模拟实现一个微型shell 进程创建 在Linux系统中我们可以在一个进程使用系统调用fork()来创建子进程&#xff0c;创建出来的进程就是子进程&#xff0c;原来的进程为父进程。…...

Typeerror: cannot read properties of undefined (reading ‘XXX‘)

最近需要在离线机器上运行软件&#xff0c;所以得把软件用docker打包起来&#xff0c;大部分功能都没问题&#xff0c;出了一个奇怪的事情。同样的代码&#xff0c;在本机上用vscode可以运行起来&#xff0c;但是打包之后在docker里出现了问题。使用的是dialog组件&#xff0c;…...