蓝桥杯之并查集

算法思想

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

问题场景:

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

树或多棵树),将多个集合合并(多棵树合并为一棵树),合并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.mzph.cn/pingmian/69898.shtml

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

相关文章

list_for_each_entry_safe 简介

list_for_each_entry_safe 是 Linux 内核中用于遍历链表的一个宏&#xff0c;特别适用于在遍历过程中可能需要删除链表节点的场景。它的设计保证了在删除当前节点时&#xff0c;不会影响后续节点的访问&#xff0c;从而实现安全的遍历。 定义 #define list_for_each_entry_sa…

如何在Java EE中使用标签库?

在Java EE&#xff08;现在称为Jakarta EE&#xff09;中使用标签库&#xff08;Tag Library&#xff09;&#xff0c;主要是通过JSP标准标签库&#xff08;JSTL&#xff09;或自定义标签库来实现的。标签库允许在JSP页面中使用自定义的标签&#xff0c;从而简化页面逻辑、增强…

el-table封装一个自定义列配置表格组件(vue3开箱即用)

组件核心功能 拖拽排序&#xff08;使用 vuedraggable&#xff09; 显示/隐藏控制 列宽调整 列固定状态记忆 搜索过滤列 本地存储&#xff08;localStorage&#xff09;可改成接口保存 默认配置恢复 通过 searchText 动态过滤列。 安装拖拽依赖 npm install vuedragg…

基于Docker-compose的禅道部署实践:自建MySQL与Redis集成及故障排查指南

基于Docker-compose的禅道部署实践&#xff1a;自建MySQL与Redis集成及故障排查指南 禅道镜像版本&#xff1a;easysoft/zentao:21.4 Redis版本&#xff1a;redis:6.2.0 Mysql版本&#xff1a;mysql:8.0.35 文章目录 **基于Docker-compose的禅道部署实践&#xff1a;自建MySQL与…

九.Spring Boot使用 ShardingSphere + MyBatis + Druid 进行分库分表

文章目录 前言一、引入依赖二、创建一个light-db_1备用数据库三、配置文件 application-dev.yml四、创建shardingsphere-config.yml完整项目结构 五、测试总结 前言 在现代化微服务架构中&#xff0c;随着数据量的不断增长&#xff0c;单一数据库已难以满足高可用性、扩展性和…

如何借助NoETL指标平台实现数据分析、决策的提效?

通常&#xff0c;企业通过明确分析目标、定位所需分析的数据&#xff0c;再通过多渠道汇集销售数据、客户反馈、市场调研等信息&#xff0c;经过数据清洗、缺失值处理及格式标准化等手段&#xff0c;运用描述性统计、回归分析、聚类分析及关联规则挖掘等多样分析方法&#xff0…

hexo 魔改 | 修改卡片透明度

hexo 魔改 | 修改卡片透明度 ** 博客食物用更佳 博客地址 ** 这是笔者自己瞎倒腾的。作为前端菜鸡一枚&#xff0c;大佬们随便看看就好~ 我用的主题是 butterfly 4.12.0 分析 通过开发者工具可以看出来卡片的背景和 --card-bg 变量有关 再在 sources 下的 css 文件夹下的…

Qt的QTableWidget样式设置

在 Qt 中&#xff0c;可以通过样式表&#xff08;QSS&#xff09;为 QTableWidget 设置各种样式。以下是一些常见的样式设置示例&#xff1a; 1. 基本样式设置 tableWidget->setStyleSheet(// 表格整体样式"QTableWidget {"" background-color: #F0F0F0;…

MySQL、MariaDB 和 TDSQL 的区别

MySQL、MariaDB 和 TDSQL 是三种不同的数据库管理系统&#xff0c;它们在设计理念、功能、性能和使用场景上有一些显著的区别。 以下是对这三者的详细比较和介绍。 1. MySQL 概述 类型&#xff1a;关系型数据库管理系统&#xff08;RDBMS&#xff09;。开发者&#xff1a;最…

制造业物联网的十大用例

预计到 2026 年&#xff0c;物联网制造市场价值将达到 4000 亿美元。实时收集和分析来自联网物联网设备与传感器的数据&#xff0c;这一能力为制造商提供了对生产流程前所未有的深入洞察。物联网&#xff08;IoT&#xff09;有潜力彻底改变制造业&#xff0c;使工厂能够更高效地…

JVM——堆的回收:引用计数发和可达性分析法、五种对象引用

目录 引用计数法和可达性分析法 引用计数法&#xff1a; 可达性分析算法&#xff1a; 五种对象引用 软引用&#xff1a; 弱引用&#xff1a; 引用计数法和可达性分析法 引用计数法&#xff1a; 引用计数法会为每个对象维护一个引用计数器&#xff0c;当对象被引用时加1&…

提升编程效率,体验智能编程助手—豆包MarsCode一键Apply功能测评

提升编程效率&#xff0c;体验智能编程助手—豆包MarsCode一键Apply功能测评 &#x1f31f; 嗨&#xff0c;我是LucianaiB&#xff01; &#x1f30d; 总有人间一两风&#xff0c;填我十万八千梦。 &#x1f680; 路漫漫其修远兮&#xff0c;吾将上下而求索。 目录 引言豆包…

【前端】【面试】vue动态样式总结

在 Vue 中&#xff0c;动态样式的设置是一个常见需求&#xff0c;可通过多种方式实现&#xff0c;以下是对这些方式的详细总结&#xff1a; 1. 绑定 class 属性 对象语法 可以给 :class 绑定一个对象&#xff0c;以动态地切换类名。对象的键是类名&#xff0c;值是一个布尔值…

Java--IO流详解 (上)--字符流

目录 IO流的概念 字符流 输入流 Reader核心方法 1.close() 2.mark(int readAheadLimit) 3.markSupported() 4.read() 5.read(char[] cbuf) 6.read(char[] cbuf, int off, int len) 7.read(CharBuffer target) 8.ready() 9.reset() 10.skip(long n) Reader 的常用…

物联网智能语音控制灯光系统设计与实现

背景 随着物联网技术的蓬勃发展&#xff0c;智能家居逐渐成为现代生活的一部分。在众多智能家居应用中&#xff0c;智能灯光控制系统尤为重要。通过语音控制和自动调节灯光&#xff0c;用户可以更便捷地操作家中的照明设备&#xff0c;提高生活的舒适度与便利性。本文将介绍一…

探讨使用ISVA代替“Open Liberty使用指南及微服务开发示例”中日志审计功能

在Open Liberty使用指南及开发示例&#xff08;四&#xff09;一文开始日志审计功能占有了一定的开发工作量&#xff0c;那么是否可以使用IBM Security Verify Access&#xff08;ISVA&#xff09;代替以节省开发工作&#xff1f;如果可行&#xff0c;那么以后各类应用的日志审…

STM32、GD32驱动TM1640原理图、源码分享

一、原理图分享 二、源码分享 /************************************************* * copyright: * author:Xupeng * date:2024-07-18 * description: **************************************************/ #include "smg.h"#define DBG_TAG "smg&…

Java ArrayList(单列集合)

ArrayList 是 Java 中最常用的一个集合类&#xff0c;它属于 java.util 包。ArrayList 实现了 List 接口&#xff0c;提供了动态数组的功能。与普通数组不同&#xff0c;ArrayList 在元素增删时会自动调整大小&#xff0c;因此它的大小是可变的。 1. ArrayList 的基本特性 动…

二次封装axios解决异步通信痛点

为了方便扩展,和增加配置的灵活性,这里将通过封装一个类来实现axios的二次封装,要实现的功能包括: 为请求传入自定义的配置,控制单次请求的不同行为在响应拦截器中对业务逻辑进行处理,根据业务约定的成功数据结构,返回业务数据对响应错误进行处理,配置显示对话框或消息形…

TOML介绍

0 Preface/Foreword TOML&#xff0c;一种配置文件格式。Toms Obvious Minimal Language. 1 介绍 TOML: Toms Obvious Minimal Language&#xff0c;“显而易见的最小化语言 ” JSON&#xff1a;不支持注释 YAML&#xff1a;过于复杂