蓝桥杯之并查集

算法思想

并查集是一种树形的数据结构,主要用于解决一些元素分组问题。用于处理一些不相交集合的合并以及查询问题。并查集的思想是用一个数组表示了整片森林,树的根节点唯一标识了一个集合,我们只要找到了某个元素的树根,就能确定他在哪个集合里

问题场景:

合并:将若干个元素合并到一个或者多个集合(构成一棵

树或多棵树),将多个集合合并(多棵树合并为一棵树),合并x,y两个元素时,不能直接合并两个元素,而是要合并两个元素所在的树根

查询:查询两个元素是否在同一个集合中。查询x和y是否在同一个集合,查找x和y对应的树根,看看是否是同一个树的树根

其他:计算共有几个集合(几棵树)

代码实现:

//并查集,(查找两个数字在不在一个集合中)
const int Size = 9;//(数字范围为1-8),在parent数组中下标就可以来表示数字,下标对应的值
//就可以来指向其父节点
int parent[Size];
//加权优化,规定节点层数,每次放节点时从节点层数高的放
int Rank[Size];
//加权优化与路径压缩只能存在一个,因为路径压缩会改变Rank值
//找x对应的父节点
int find(int x)
{if (x == parent[x]){return x;}//路径压缩:在将每一个的值得父节点都改为最终的父节点//parent[x]= find(parent[x]);//return parent[x];return find(parent[x]);
}
//合并就是去合并根节点
void merge(int x, int y)
{x = find(x);y = find(y);if (x != y){if (Rank[x] > Rank[y]){parent[y] = x;}else if (Rank[x] < Rank[y]){parent[x] = y;}else{parent[y] = x;Rank[x]++;}}
}
int main()
{for (int i = 0; i < Size; i++){//刚开始默认父节点为自己parent[i] = i;Rank[i] = 1;}int x, y;for (int i = 0; i < 6; i++){cin >> x >> y;merge(x, y);}cout << (find(6)==find(1))?"ok":"no";return 0;
}

例子:最小生成树

现在有一个地点为Ai,一个地点为Bi,又一个结构为一条路,这条路连接(存储)了两个地点,还有到这两个地点的距离cost,一个Ai一个Bi一个cost构成了一个最小集合,现在有n个这样的集合,

那么可以根据这个cost,比如现在根据cost来将n个最小集合排序,现在问一个Ai到Bj之间怎么怎么样,那Ai与Bj肯定是要相互连通的,根据上面的并查集结构,将这n个最小集合构成一个并查集所形成的的树就叫最小生成树,如果Ai与Bj有公共父节点那么他们肯定是连通的,这时可以根据题目要求结合下面的代码进行求解(比如问题:躲避拥堵的最佳路线)

struct Edge
{Edge(int s, int e, int c) :start(s), end(e), cost(c){}int start;int end;int cost;
};
int parent[10000];
int find(int x)
{if (x == parent[x]){return x;}return parent[x] = find(parent[x]);
}
bool Mycompare(const Edge& e1, const Edge& e2)
{return e1.cost < e2.cost;
}
int main()
{for (int i = 0; i < 10000; i++){parent[i] = i;}vector<Edge>edge;int n;cin >> n;char s, e;int c;for (int i = 0; i < n; i++){cin >> s >> e >> c;edge.push_back(Edge(s, e, c));}sort(edge.begin(), edge.end(), Mycompare);for (int j = 0; j < edge.size(); j++){int a = find(edge[j].start);int b = find(edge[j].end);if (a != b){parent[a] = b;printf("%c->%c:cost:%d ", edge[j].start, edge[j].end, edge[j].cost);}}return 0;
}

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

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

相关文章

Windows11+PyCharm利用MMSegmentation训练自己的数据集保姆级教程

系统版本&#xff1a;Windows 11 依赖环境&#xff1a;Anaconda3 运行软件&#xff1a;PyCharm 一.环境配置 通过Anaconda Prompt(anaconda)打开终端创建一个虚拟环境 conda create --name mmseg python3.93.激活虚拟环境 conda activate mmseg 4.安装pytorch和cuda tor…

#渗透测试#批量漏洞挖掘#Crocus系统—Download 文件读取

免责声明 本教程仅为合法的教学目的而准备&#xff0c;严禁用于任何形式的违法犯罪活动及其他商业行为&#xff0c;在使用本教程前&#xff0c;您应确保该行为符合当地的法律法规&#xff0c;继续阅读即表示您需自行承担所有操作的后果&#xff0c;如有异议&#xff0c;请立即停…

day09_实时类标签/指标

文章目录 day09_实时类标签/指标一、日志数据实时采集2、Flume简介2.3 项目日志数据采集Flume配置2.3.1 涉及的Flume组件和参数2.3.2 Nginx日志采集2.3.3 用户行为日志采集 二、Nginx日志数据统计1、日志格式说明2、数据ETL2.1 日志抽取2.1.1 正则表达式2.1.2 基于Spark实现Ngi…

SpringBoot实战:高效获取视频资源

文章目录 前言技术实现SpringBoot项目构建产品选取配置数据采集 号外号外 前言 在短视频行业高速发展的背景下&#xff0c;海量内容数据日益增长&#xff0c;每天都有新的视频、评论、点赞、分享等数据涌现。如何高效、精准地获取并处理这些庞大的数据&#xff0c;已成为各大平…

位图,晶圆MAP 边缘算法

例如这样的一张图: 如果想要求外边缘点&#xff0c;即红色区域,首先遍历所有点位&#xff0c;求出每行每列X轴和Y轴的最大值MAX和最小值MIN。然后再次遍历每个点&#xff0c;判断该点的X值&#xff0c;Y值是否是最大值或者最小值&#xff0c;如果是&#xff0c;那么它就是外边…

【认证授权FAQ】SSL/TLS证书过期导致的CLS认证失败

问题现象 问题分析 属于Agent操作系统的根认证机构过期问题&#xff0c;需要下载CA然后在系统安装。 DigiCert根证书和中间证书将在未来几年过期&#xff0c;一旦证书过期&#xff0c;基于证书颁发的SSL/TLS证书将不再信任&#xff0c;导致网站无法HTTPs访问。需要迁移到新的根…

【安全测试】0基础新手学Web安全测试笔记(一)

文章目录 一、关于账号密码的漏洞二、关于验证码的漏洞三、Burp工具的使用四、渗透测试1. 渗透测试类型2. 脆弱性评估 五、常见的应用安全风险1. 注入2. 失效的身份认证3. 敏感数据泄露4. XML外部实体(XXE)5. 失效的访问控制6. 安全配置错误7. 跨站脚本:(XSS)8. 不安全的反序列…

旅游行业内容管理系统CMS提升网站建设效率与体验

内容概要 在如今快速发展的互联网时代&#xff0c;旅游行业对网站的要求越来越高&#xff0c;内容管理系统&#xff08;CMS&#xff09;的应用不可或缺。以 Baklib 为代表的先进CMS可显著提高旅游网站的建设效率与用户体验。为了满足不断变化的市场需求&#xff0c;这些系统通…

数据库安全、分布式数据库、反规范化等新技术(高软19)

系列文章目录 3.7数据库安全、分布式数据库、反规范化等新技术 前言 本节数据库安全、分布式数据库、反规范化等新技术相关概念与技术。 一、数据库 1.数据库安全 2.数据库备份 二、分布式数据库 1.数据库分布 2.数据仓库 3.数据仓库结构 4.商业智能&#xff08;BI&#xf…

【docker知识】快速找出服务器中占用内存较高的容器

本文由Markdown语法编辑器编辑完成。 1.背景&#xff1a; 近期在处理现场问题&#xff0c;观察服务器时&#xff0c;会遇到某些进程占用较高内存的情况。由于我们的服务&#xff0c;基本上都是以容器的方式在运行&#xff0c;因此就需要找到&#xff0c;到底是哪个容器&#…

【Android开发】华为手机安装包安装失败“应用是非正式版发布版本,当前设备不支持安装”问题解决

问题描述 我们将Debug版本的安装包发送到手机上安装&#xff0c;会发现华为手机有如下情况 解决办法 在文件gradle.properties中粘贴代码&#xff1a; android.injected.testOnlyfalse 最后点击“Sync now”&#xff0c;等待重新加载gradle资源即可 后面我们重新编译Debug安装…

docker 部署nginx,nginx 504

遇到问题 原因&#xff1a; 因为用的docker 部署nginx, docker 应用与服务之间的端口未开放&#xff0c;导致访问不到服务。

【数据结构】(8) 二叉树

一、树形结构 1、什么是树形结构 根节点没有前驱&#xff0c;其它节点只有一个前驱&#xff08;双亲/父结点&#xff09;。所有节点可以有 0 ~ 多个后继&#xff0c;即分支&#xff08;孩子结点&#xff09;。每个结点作为子树的根节点&#xff0c;这些子树互不相交。 2、关于…

牛客网-小美的加法(C++)

链接&#xff1a;登录—专业IT笔试面试备考平台_牛客网 来源&#xff1a;牛客网 题目描述 小美有一个长度为 n 的数组&#xff0c;她想将这个数组进行求和&#xff0c;即 suma1a2...an。 小美可以使用一次魔法&#xff08;也可以不使用&#xff09;&#xff0c;将其中一个加号…

瑞芯微开发板/主板Android调试串口配置为普通串口方法 深圳触觉智能科技分享

本文介绍瑞芯微开发板/主板Android调试串口配置为普通串口方法&#xff0c;不同板型找到对应文件修改&#xff0c;修改的方法相通。触觉智能RK3562开发板演示&#xff0c;搭载4核A53处理器&#xff0c;主频高达2.0GHz&#xff1b;内置独立1Tops算力NPU&#xff0c;可应用于物联…

MongoDB 7 分片副本集升级方案详解(下)

#作者&#xff1a;任少近 文章目录 1.4 分片升级1.5 升级shard11.6 升级shard2,shard31.7 升级mongos1.8重新启用负载均衡器1.9 推荐MongoDB Compass来验证数据 2 注意事项&#xff1a; 1.4 分片升级 使用“滚动”升级从 MongoDB 7.0 升级到 8.0&#xff0c;即在其他成员可用…

【redis】数据类型之bitmaps

Redis的Bitmaps是一种基于字符串的数据结构&#xff0c;用于处理位级别的操作。虽然Bitmaps在Redis中并不是一种独立的数据类型&#xff0c;而是基于字符串实现的&#xff0c;但它们提供了高效的位操作功能&#xff0c;适用于需要处理大量布尔值或二进制数据的场景。 基本概念…

mysql8.0使用MGR实现高可用与利用MySQL Router构建读写分离MGR集群

MGR是MySQL Group Replication的缩写&#xff0c;即MySQL组复制。 在以往&#xff0c;我们一般是利用MySQL的主从复制或半同步复制来提供高可用解决方案&#xff0c;但这存在以下几个比较严重的问题&#xff1a; 主从复制间容易发生复制延迟&#xff0c;尤其是在5.6以前的版本…

【IC】AI处理器核心--第二部分 用于处理 DNN 的硬件设计

第 II 部分 用于处理 DNN 的硬件设计 第 3 章 关键指标和设计目标 在过去的几年里&#xff0c;对 DNN 的高效处理进行了大量研究。因此&#xff0c;讨论在比较和评估不同设计和拟议技术的优缺点时应考虑的关键指标非常重要&#xff0c;这些指标应纳入设计考虑中。虽然效率通常…

Flutter Gradle 命令式插件正式移除,你迁移旧版 Gradle 配置了吗?

在 Flutter 3.29 版本里官方正式移除了 Flutter Gradle Apply 插件&#xff0c;其实该插件自 3.19 起已被弃用&#xff0c;同时 Flutter 团队后续也打算把 Flutter Gradle 从 Groovy 转换为 Kotlin&#xff0c;并将其迁移到使用 AGP&#xff08;Android Gradle Plugin&#xff…