在图论的众多算法中,Kruskal 算法以其简洁高效的特性,成为求解最小生成树(Minimum Spanning Tree,MST)的经典方法。无论是在通信网络的优化设计、电路布线的成本控制,还是在计算机考研 408 的备考过程中,Kruskal 算法都占据着重要的地位。

Kruskal 算法的基本概念

在介绍 Kruskal 算法之前,我们需要先明确几个关键概念:

  • :由顶点(节点)集合和边集合组成,边可以有权值,用于表示顶点之间的关系和连接代价。
  • 生成树:对于一个连通图,它的生成树是包含图中所有顶点的无环连通子图。
  • 最小生成树:在带权连通图的所有生成树中,边的权值之和最小的生成树称为最小生成树。

Kruskal 算法的目标,就是在给定的带权连通图中,找到这样一棵最小生成树。例如,在一个城市间的通信网络建设中,每个城市是图的顶点,城市间铺设通信线路的成本是边的权值,Kruskal 算法可以帮助我们找到成本最低的网络连接方案。

Kruskal 算法的思想

Kruskal 算法基于贪心策略,其核心思想是:在图中选取权值最小的边,若该边加入已选边集合后不会形成环,则将其加入;不断重复这个过程,直到选取的边构成一棵包含图中所有顶点的树,此时得到的树就是最小生成树。

具体执行过程如下:

  1. 初始化:将图中的所有边按照权值从小到大进行排序,并初始化一个空的边集合用于存储最小生成树的边,同时将每个顶点看作一个独立的集合(利用并查集数据结构实现)。
  1. 遍历边集:依次遍历排序后的边集合,对于每条边,检查其两个端点是否属于不同的集合(即是否会形成环)。如果属于不同集合,则将该边加入最小生成树的边集合中,并合并两个端点所在的集合;如果属于相同集合,则跳过该边,因为加入后会形成环。
  1. 结束条件:当最小生成树的边集合中包含n - 1条边时(n为图中顶点的数量),停止遍历,此时得到的边集合构成的树即为最小生成树。

Kruskal 算法的解题思路

利用 Kruskal 算法解决实际问题时,一般遵循以下步骤:

  1. 构建图模型:根据题目描述,将问题抽象为带权连通图,确定顶点集合、边集合以及每条边的权值。
  1. 初始化并查集:为图中的每个顶点创建一个独立的集合,用于后续判断边加入后是否会形成环。
  1. 边排序:将图中的所有边按照权值从小到大进行排序。
  1. 执行 Kruskal 算法:遍历排序后的边集合,按照算法规则选取边加入最小生成树的边集合中,同时使用并查集维护顶点集合的连通性。
  1. 处理结果:根据题目要求,返回最小生成树的边集合、边的权值之和,或者进行其他相关处理。

LeetCode 例题及 Java 代码实现

例题:网络延迟时间(LeetCode 1135)

用以太网线缆将 n 台计算机连接成一个网络,计算机的编号从 0 到 n - 1。线缆用 connections 表示,其中 connections[i] = [a_i, b_i, cost_i] 连接计算机 a_i 和 b_i ,费用为 cost_i。请你计算将所有计算机连接成一个网络的最低成本。如果无法将所有计算机连接成一个网络,则返回 -1 。

解题思路

本题可以将计算机看作图的顶点,线缆连接看作边,连接费用看作边的权值,问题转化为求图的最小生成树的权值之和。使用 Kruskal 算法,先对边按权值排序,然后通过并查集判断边加入后是否成环,逐步构建最小生成树,最后计算最小生成树的权值之和。如果最终选取的边数小于n - 1,则说明无法连接所有计算机,返回 -1 。

代码实现
import java.util.Arrays;import java.util.Comparator;public class MinimumCostToConnectSticks {// 并查集的父节点数组private int[] parent;// 初始化并查集private void init(int n) {parent = new int[n];for (int i = 0; i < n; i++) {parent[i] = i;}}// 查找节点的根节点private int find(int x) {if (parent[x] != x) {parent[x] = find(parent[x]);}return parent[x];}// 合并两个节点所在的集合private boolean union(int x, int y) {int rootX = find(x);int rootY = find(y);if (rootX != rootY) {parent[rootX] = rootY;return true;}return false;}public int minimumCost(int n, int[][] connections) {init(n);// 按边的权值从小到大排序Arrays.sort(connections, Comparator.comparingInt(c -> c[2]));int cost = 0;int count = 0;for (int[] connection : connections) {int a = connection[0] - 1;int b = connection[1] - 1;int weight = connection[2];if (union(a, b)) {cost += weight;count++;if (count == n - 1) {break;}}}return count == n - 1 ? cost : -1;}}

例题:重新安排行程(LeetCode 332)

给定一个机票的字符串二维数组 [from, to],子数组中的两个成员分别表示飞机出发和降落的机场地点,对该行程进行重新规划排序。所有这些机票都属于一个从 JFK(肯尼迪国际机场)出发的先生,所以该行程必须从 JFK 开始。

提示:

  • 如果存在多种有效的行程,请你按字典排序返回最小的行程组合。例如,行程 ["JFK", "LGA"] 与 ["JFK", "LGB"] 相比就更小,排序更靠前。
  • 所有的机场都用三个大写字母表示(机场代码)。
  • 假定所有机票至少存在一种合理的行程。
  • 所有的机票必须都用一次 且 只能用一次。
解题思路

本题可以将机场看作顶点,机票看作边,构建一个图。由于要求按字典序最小的行程,我们可以先对边(机票)进行排序,然后利用类似 Kruskal 算法的思想,从JFK出发,逐步选取边构建路径。在构建过程中,使用深度优先搜索(DFS)来遍历图,确保所有边都被使用一次且仅一次。

代码实现
import java.util .*;public class ReconstructItinerary {private Map<String, PriorityQueue<String>> graph;private List<String> result;private void dfs(String airport) {PriorityQueue<String> nextAirports = graph.get(airport);while (nextAirports != null && !nextAirports.isEmpty()) {dfs(nextAirports.poll());}result.add(0, airport);}public List<String> findItinerary(List<List<String>> tickets) {graph = new HashMap<>();for (List<String> ticket : tickets) {String from = ticket.get(0);String to = ticket.get(1);graph.putIfAbsent(from, new PriorityQueue<>());graph.get(from).offer(to);}result = new ArrayList<>();dfs("JFK");return result;}}

Kruskal 算法与考研 408

在计算机考研 408 中,Kruskal 算法是数据结构和算法部分的重要考点,主要涉及以下几个方面:

  1. 算法原理与实现:考生需要熟练掌握 Kruskal 算法的基本原理、执行步骤和代码实现。常考查算法的初始化过程、边的排序方法、并查集的使用,以及如何通过贪心策略构建最小生成树。例如,要求考生分析算法在给定图上的执行过程,或者写出算法的伪代码或具体实现代码。
  1. 时间复杂度与空间复杂度:Kruskal 算法的时间复杂度主要由边的排序和并查集操作决定。边排序的时间复杂度为\(O(E \log E)\)(\(E\)为边的数量),并查集操作的时间复杂度近似为\(O(E \alpha(V))\)(\(V\)为顶点数量,\(\alpha(V)\)是一个增长极其缓慢的函数,可近似看作常数),因此整体时间复杂度为\(O(E \log E)\)。空间复杂度主要用于存储边集合和并查集,为\(O(E + V)\)。考研 408 中可能会考查对这些复杂度的分析和理解。
  1. 与其他最小生成树算法的对比:Prim 算法也是求解最小生成树的常用算法,考研 408 中可能会考查 Kruskal 算法与 Prim 算法的对比。例如,分析它们的适用场景(Kruskal 算法适用于稀疏图,Prim 算法适用于稠密图)、时间复杂度和空间复杂度的差异等。
  1. 算法的应用与变形:考研 408 中可能会出现基于 Kruskal 算法的变形题目,结合实际问题进行考查。例如,在最小生成树的基础上增加限制条件(如限制某些边必须包含或不能包含),要求考生灵活运用 Kruskal 算法的思想进行求解。这需要考生深入理解算法本质,能够将算法原理应用到不同的场景中。

在备考过程中,建议考生通过做大量的练习题来加深对 Kruskal 算法的理解,熟练掌握算法的各种细节。同时,对比学习 Prim 算法等相关内容,形成系统的知识体系,提高在考试中的解题能力。

总结

Kruskal 算法以其简洁高效的贪心策略,为最小生成树问题提供了优秀的解决方案。本文从算法的基本概念、核心思想出发,详细介绍了解题思路,并通过 LeetCode 例题和 Java 代码实现展示了算法的实际应用,同时结合考研 408 的考点进行了深入分析。

希望本文能够帮助读者更深入地理解Kruskal 算法,并在实际项目中发挥其优势。谢谢阅读!


希望这份博客能够帮助到你。如果有其他需要修改或添加的地方,请随时告诉我。

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

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

相关文章

Vue+Openlayers加载OSM、加载天地图

文章目录1. 介绍2. 加载底图2.1 加载默认OSM地图2.2 加载天地图1. 介绍 Openlayers官网&#xff1a;https://openlayers.org/ 安裝依赖&#xff1a;npm i ol 2. 加载底图 参考博客&#xff1a; vueopenlayers环境配置&#xff1a;https://blog.csdn.net/cuclife/article/det…

Python处理电子表格文件库之pyexcel使用详解

概要 pyexcel是一个功能强大的Python第三方库,专门用于处理各种格式的电子表格文件。核心价值在于提供了统一的接口来读取、写入和操作Excel、CSV、ODS等多种电子表格格式,极大简化了数据处理工作流程。与传统的单一格式处理库不同,pyexcel采用了插件化架构,使开发者能够通…

【网络安全】恶意 Python 包“psslib”仿冒 passlib,可导致 Windows 系统关闭

文章目录恶意 Python 包“psslib”仿冒 passlib如何避免psslib的威胁恶意 Python 包“psslib”仿冒 passlib Socket 的威胁研究团队发现了一个名为 psslib 的恶意 Python 包&#xff0c;旨在以提供密码安全功能为幌子突然关闭 Windows 系统。 该软件包由威胁行为者使用别名 u…

ai之对接电信ds后端服务,通过nginx代理转发https为http,对外请求,保持到达第三方后请求头不变

前置环境&#xff1a; 在微信小程序中嵌入H5页面&#xff08;智能客服&#xff09;&#xff0c;需要让h5页面在https的域名服务器上。即通过 nginx 部署成web服务&#xff0c;还得配置域名和端口443访问。电信的第三方deepseek服务 &#xff0c;只接收http请求&#xff0c;暂未…

第十四节:Vben Admin 最新 v5.0 (vben5) + Python Flask 快速入门 - Flask 后端 生产部署讲解

Vben5 系列文章目录 💻 基础篇 ✅ 第一节:Vben Admin 最新 v5.0 (vben5) + Python Flask 快速入门 ✅ 第二节:Vben Admin 最新 v5.0 (vben5) + Python Flask 快速入门 - Python Flask 后端开发详解(附源码) ✅ 第三节:Vben Admin 最新 v5.0 (vben5) + Python Flask 快速入…

Unity开发如何解决iOS闪退问题

一、iOS闪退常见原因及排查方法1. 内存问题&#xff08;最常见原因&#xff09; 症状表现&#xff1a; 设备发热后闪退 加载大型场景时崩溃 控制台出现EXC_RESOURCE RESOURCE_TYPE_MEMORY日志 解决方案&#xff1a; // 内存监控代码 void Update() { Debug.Log($"内存使用…

【机器学习笔记 Ⅲ】5 强化学习

强化学习&#xff08;Reinforcement Learning, RL&#xff09; 强化学习是机器学习的一个分支&#xff0c;其核心思想是让智能体&#xff08;Agent&#xff09;通过与环境&#xff08;Environment&#xff09;的交互学习最优策略&#xff08;Policy&#xff09;&#xff0c;以最…

pytorch深度学习-卷积神经网络CNN-MNIST-gpu加速

一、为什么需要 CNN&#xff1f;从图像识别的 “麻烦” 说起假设你想让电脑识别一张图片里有没有猫。 如果用传统神经网络&#xff1a;一张 100100 的彩色图片&#xff0c;有 100100330000 个像素点&#xff0c;每个像素点都是一个输入神经元。传统网络需要每个输入神经元和隐藏…

【阿里巴巴JAVA开发手册】IDE的text file encoding设置为UTF-8; IDE中文件的换行符使用Unix格式,不要使用Windows格式。

问题&#xff1a;当使用 IDEA SSH 远程开发时&#xff0c;SFTP 同步的 Windows 本地编辑的 config/plugin_config 文件文本内容中 “换行符”与 Unix、Linux 的文件文本内容换行符字符集不一致&#xff0c;导致 docker 容器中自定义 /opt/seatunnel/bin/install_plugin 在执行以…

自动驾驶ROS2应用技术详解

自动驾驶ROS2应用技术详解 目录 自动驾驶ROS2节点工作流程自动驾驶感知融合技术详解多传感器数据同步技术详解ROS2多节点协作与自动驾驶系统最小节点集 1. 自动驾驶ROS2节点工作流程 1.1 感知输出Topic的后续处理 在自动驾驶系统中&#xff0c;感知节点输出的各种Topic会被…

Redis底层实现原理之订阅发布机制

文章目录1. 通知类型2. 实现原理2.1 Pub/Sub2.1.1 基础知识点2.1.2 频道和订阅者的存储通知原理2.1.3 键空间通知2.1.4 客户端消费2.1.5 缺陷2.2 Redis Stream2.2.1 基础知识点2.2.2 基础数据结构2.2.3 消费者组管理2.2.4 消息和消费者持久化2.2.5 消息生产和消费2.2.6 消费者拉…

【MATLAB代码】AOA与TDOA混合定位例程,自适应基站数量,二维,可调节锚点数量。订阅专栏后,可直接查看matlab源代码

本文给出一个matlab代码,用于在二维平面上,使用AOA的角度测量和TDOA的到达时间差的测量,来达到对未知点的精确定位。最后输出定位示意图、真实点坐标、仅AOA定位坐标与误差、仅TDOA定位的坐标与误差、AOA+TDOA混合定位的坐标与误差。订阅专栏后可直接查看源代码,粘贴到MATL…

Node.js 所有主要版本的发布时间、稳定版本(Stable)和长期支持版本(LTS) 的整理

以下是 Node.js 所有主要版本的发布时间、稳定版本&#xff08;Stable&#xff09;和长期支持版本&#xff08;LTS&#xff09; 的整理&#xff0c;涵盖从早期版本到当前最新版本的信息。 &#x1f4c5; Node.js 版本发布规律 每 6 个月发布一个新主版本&#xff08;偶数月&am…

【牛客刷题】小红的v三元组

文章目录 一、题目介绍1.1 题目描述1.2 输入描述1.3 输出描述1.4 示例二、解题思路2.1 核心算法设计2.2 性能优化关键2.3 算法流程图三、算法实现四、算法分析4.1 时间复杂度4.2 空间复杂度4.3 正确性证明五、为什么选择离散化+树状数组的解法?5.1 问题本质分析5.2 解法设计思…

c语言学习_函数递归

今天学习函数递归。函数递归通俗来说就是函数自己调用自己&#xff0c;递归的主要思考方式在于&#xff1a;把大事化小。例子&#xff1a;接受一个整型值&#xff0c;按照顺序打印它的每一位。void print(unsigned int n) {if (n > 9){print(n / 10);}printf("%d"…

Bash与Zsh与Fish:在Linux中你应该使用哪个Shell

命令行 shell 是与操作系统交互的重要工具&#xff0c;使用户能够高效地执行命令、自动化任务和运行脚本。 虽然有各种外壳选项可供选择&#xff0c;但Bash、Zsh和Fish作为最受欢迎的选择脱颖而出&#xff0c;每种都提供独特的功能&#xff0c;因此理解它们的差异对于选择适合…

Peek-Ubuntu上Gif录制工具-24.04LTS可装

安装方法&#xff08;Ubuntu24.04.2LTS测试通过&#xff09; sudo apt update sudo apt install peek纯无语&#xff0c;&#x1f9df; 一个软件&#xff0c;仨网站&#xff0c;四份重复的教程&#xff1a; 添加 PPA更新源报错&#xff08;不支持 noble&#xff09;搜到 4 篇教…

DVWA靶场通关笔记-验证码绕过reCAPTCHA(High级别)

目录 一、reCAPTCHA 二、代码审计&#xff08;High级别&#xff09; 1、渗透准备 &#xff08;1&#xff09;配置security为High级别。 &#xff08;2&#xff09;配置RECAPTCHA参数 &#xff08;3&#xff09;再次打开靶场 2、源码分析 &#xff08;1&#xff09;inde…

【Java安全】RMI基础

文章目录介绍实现服务端 Server客户端 Client通信过程数据端与注册中心(1099 端口)建立通讯客户端与服务端建立 TCP 通讯客户端序列化传输 调用函数的输入参数至服务端总结介绍 RMI 全称 Remote Method Invocation&#xff08;远程方法调用&#xff09;&#xff0c;即在一个 J…

MySQL索引面试问题梳理

本文系统剖析MySQL索引的核心机制&#xff1a; ‌索引分类全景图‌&#xff1a;详解聚簇/非聚簇索引的逻辑差异与物理存储特点‌B树的统治性优势‌&#xff1a;通过对比Hash/B树揭示InnoDB的底层选择逻辑 一、索引分类的常见困惑解析 1. 按物理存储分类 类型 存储内容 数量限…