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

最小生成树的 Kruskal 与 Prim 算法:从连通到最优,一篇文章彻底掌握

如何用最少的成本把 n 个城市连接起来如何铺设光纤、设计电路既保证连通又成本最低答案就在最小生成树中。最小生成树Minimum Spanning Tree, MST是图论中至关重要的概念广泛应用在网络设计、聚类分析、图像分割等领域。而 Kruskal 算法和 Prim 算法正是求解 MST 的两大经典算法。今天我们就从原理到实践把它们彻底搞懂。一、什么是最小生成树1.1 定义在无向连通图中生成树是包含所有顶点的一个无环连通子图。如果图的每条边带有权重那么最小生成树就是所有生成树中边权总和最小的那一棵。性质包含 V 个顶点恰好 V-1 条边。无环且连通。最小生成树可能不唯一当存在相同权重的边时。1.2 经典场景设计一个光纤网络连接 n 个城市花费最小。电路板布线连接所有引脚总长度最短。在图中聚类最小生成树的某些边作为簇间边界。二、Kruskal 算法——选边法2.1 核心思想贪心策略将所有边按权重从小到大排序依次选择那些不会形成环的边直到选中 V-1 条边为止。“不形成环”的检测依赖并查集Union-Find数据结构。2.2 算法步骤对图中所有边按权重升序排序。初始化并查集每个顶点自成一个集合。遍历排序后的边(u, v, w)如果u和v不在同一个集合中即连接它们不会形成环则选择这条边并将u和v合并。否则跳过。重复步骤 3直到已选边数 V-1。2.3 图解示例假设有 4 个顶点A、B、C、D边的权重A-B: 1B-C: 3A-D: 4C-D: 2B-D: 5排序后A-B(1), C-D(2), B-C(3), A-D(4), B-D(5)。选 A-B集合 {A,B}选 C-D集合 {C,D}选 B-C集合 {A,B,C,D}边数3结束。MST 总权重 1236。2.4 复杂度分析操作复杂度边排序O(E log E)并查集合并/查找近乎 O(1)路径压缩按秩合并总复杂度O(E log E)通常是 O(E log V)2.5 代码实现PythonclassUnionFind:def__init__(self,n):self.parentlist(range(n))self.rank[0]*ndeffind(self,x):ifself.parent[x]!x:self.parent[x]self.find(self.parent[x])returnself.parent[x]defunion(self,x,y):rx,ryself.find(x),self.find(y)ifrxry:returnFalseifself.rank[rx]self.rank[ry]:self.parent[rx]ryelifself.rank[rx]self.rank[ry]:self.parent[ry]rxelse:self.parent[ry]rx self.rank[rx]1returnTruedefkruskal(vertices,edges): vertices: 顶点数量 edges: [(u, v, weight), ...] u,v 为顶点索引 edges.sort(keylambdae:e[2])ufUnionFind(vertices)mst[]total_weight0foru,v,winedges:ifuf.union(u,v):mst.append((u,v,w))total_weightwiflen(mst)vertices-1:breakreturnmst,total_weight三、Prim 算法——加点法3.1 核心思想贪心策略从任意一个顶点开始每次选择连接已选集合与未选集合权重最小的边将新顶点加入已选集合直到所有顶点都被覆盖。这听起来很像 Dijkstra 最短路径算法但 Prim 维护的是到当前树的最小边权而非源点的距离。3.2 算法步骤初始化随机选一个起点s将其加入集合S。维护一个数组min_edge或优先队列记录每个未选顶点到集合S的最小边权。每次从优先队列中取出距离最小的顶点v即最小权重边对应的未选顶点将该边加入 MST并标记v加入S。更新v的邻居到集合S的边权若比当前记录小。重复直到所有顶点都已加入。3.3 图解示例使用上例的图从 A 开始S{A}邻接边A-B(1), A-D(4)选最小 A-B(1)加入 B。S{A,B}新增长边B-C(3), B-D(5)加上原来的 A-D(4)最小的是 B-C(3)等一等C-D(2) 也连接到了 C 和 D但 C 和 D 都不在 S 中注意需要保证边一端在 S一端不在。此时所有跨集合边A-D(4), B-C(3), B-D(5), 还有 C-D? C 和 D 都不在 S不跨集合。最小是 B-C(3)加入 C。S{A,B,C}跨集合边A-D(4), B-D(5), C-D(2)最小 C-D(2)加入 D。边A-B(1), B-C(3), C-D(2)权重和6。3.4 复杂度分析实现方式时间复杂度邻接矩阵 遍历O(V²)二叉堆优先队列 邻接表O((VE) log V)斐波那契堆O(E V log V)理论最优实际竞赛和工程中常用堆优化版本。3.5 代码实现二叉堆版本importheapqdefprim(adj,start0): adj: 邻接表adj[u] [(v, weight), ...] start: 起始顶点 返回: mst_edges, total_weight nlen(adj)visited[False]*n# 优先队列存储 (weight, u, v) 其中 u 为已选集合中的顶点v 为未选顶点pq[]# 初始化从 start 出发的所有边入队forv,winadj[start]:heapq.heappush(pq,(w,start,v))visited[start]Truemst[]total_weight0whilepqandlen(mst)n-1:w,u,vheapq.heappop(pq)ifvisited[v]:continuevisited[v]Truemst.append((u,v,w))total_weightw# 将 v 的邻边中未访问的顶点加入优先队列fornxt,nwinadj[v]:ifnotvisited[nxt]:heapq.heappush(pq,(nw,v,nxt))returnmst,total_weight四、Kruskal vs Prim 详细对比维度KruskalPrim策略按边权全局排序选边从一点出发逐渐扩展数据结构并查集优先队列堆时间复杂度O(E log E)O((VE) log V)堆适用图稀疏图E 远小于 V²效果更好稠密图E 接近 V²用邻接矩阵 O(V²) 更快空间复杂度O(VE)O(VE)对连通性要求整体图必须连通整体图必须连通实现难度较简单并查集模板稍复杂优先队列维护是否易于处理不连通图可生成森林最小生成森林只对连通分量有效典型应用稀疏图边数量可控如道路规划稠密图或需要实时扩展的场景实际选择建议如果图是稀疏图E ≈ VKruskal 通常更简单高效。如果图是稠密图E ≈ V²使用 Prim 的邻接矩阵版本O(V²)优于 Kruskal 的 O(E log V)。如果图的边需要动态添加且需要维护 MSTPrim 更容易增量更新。五、扩展最小生成树的唯一性判断如果图中所有边的权重互不相同则最小生成树唯一。否则可能存在多棵 MST。判断方法应用 Kruskal在边权相等时尝试以不同顺序选择看能否得到不同树。检查对于某条权重为 w 的边 e如果存在一个割使得 e 是该割中唯一的最小边则 e 必在某个 MST 中如果割中有多个等重的最小边那么 MST 可能不唯一。六、实际应用场景对比场景推荐算法理由城市间铺设电缆几百个点边数较少Kruskal边数可控排序易电路板布线密集引脚Prim矩阵版稠密图矩阵遍历简单实时网络拓扑动态添加节点Prim堆增量扩展方便处理不连通图多个孤岛Kruskal直接得到最小生成森林大数据图边超千万Kruskal外部排序并查集内存友好七、常见面试问题Q1Prim 算法和 Dijkstra 算法的区别Dijkstra 求的是单源最短路径累加的是从源点到当前点的路径长度。Prim 求的是 MST累加的是当前树到新顶点的直接边权。Q2如果图不连通Kruskal 和 Prim 会怎样Kruskal 会输出最小生成森林每个连通分量的 MST 合并。Prim 只从起点开始只能生成该连通分量内的 MST。Q3MST 是否可能含有图中最长的边不可能。MST 总是避免使用最长边除非在环中其他边都更长不可能因为环中最长边可以被替换。具体可用“回路性质”证明。八、总结Kruskal 算法全局选边并查集防环。适合稀疏图。Prim 算法局部扩展优先队列取最小跨边。适合稠密图。两者都是贪心算法且都能保证全局最优解贪心选择性质。掌握它们你就掌握了最小生成树的全部基础。思考题如果图中存在负权边Kruskal 和 Prim 还能正确工作吗为什么提示最小生成树定义在无向图上负权边不会导致环形成更小的树算法依然正确但一般不考虑负权因为权值可以是负的不影响贪心选择。如果觉得有帮助欢迎点赞、收藏、转发本文首发于 CSDN未经授权禁止转载。

相关文章:

最小生成树的 Kruskal 与 Prim 算法:从连通到最优,一篇文章彻底掌握

如何用最少的成本,把 n 个城市连接起来?如何铺设光纤、设计电路,既保证连通又成本最低?答案就在 最小生成树 中。最小生成树(Minimum Spanning Tree, MST)是图论中至关重要的概念,广泛应用在网络…...

长链思维推理:大模型深度思考的核心能力与工程实践指南

1. 项目概述:长链思维推理的演进与核心价值如果你最近关注大语言模型(LLM)的发展,尤其是像 OpenAI o1、DeepSeek-R1 这类“推理模型”的崛起,那么“长链思维推理”这个概念一定不会陌生。它不再是早期 GPT-3.5 那种简单…...

Whiz:基于AI的终端命令生成工具,提升开发效率

1. 项目概述:为你的终端装上“副驾驶”如果你和我一样,每天有超过一半的工作时间是在终端(Terminal)里度过的,那你一定也经历过这样的时刻:面对一个复杂的命令,需要反复查阅man手册;…...

如何快速部署开源实验室管理系统:面向中小型实验室的完整指南

如何快速部署开源实验室管理系统:面向中小型实验室的完整指南 【免费下载链接】senaite.lims SENAITE Meta Package 项目地址: https://gitcode.com/gh_mirrors/se/senaite.lims 在当今数字化时代,实验室管理面临着前所未有的挑战:如何…...

Loopi:本地优先的AI智能体自动化平台,打通大模型与真实世界操作

1. 项目概述:当AI拥有“双手”与“眼睛”如果你曾尝试将AI的能力与真实世界的操作结合起来,比如让AI自动帮你整理邮件、抓取网页数据并生成报告,或者搭建一个能自主处理客服工单的智能助手,你可能会发现一个巨大的鸿沟。一边是强大…...

Mesa 3.0:Python多智能体建模的架构革命与工程实践

Mesa 3.0:Python多智能体建模的架构革命与工程实践 【免费下载链接】mesa Mesa is an open-source Python library for agent-based modeling, ideal for simulating complex systems and exploring emergent behaviors. 项目地址: https://gitcode.com/gh_mirror…...

csp信奥赛C++高频考点专项训练之贪心算法 --【删数问题】:删数问题

csp信奥赛C高频考点专项训练之贪心算法 --【删数问题】:删数问题 题目描述 键盘输入一个高精度的正整数 nnn(不超过 250250250 位),去掉其中任意 kkk 个数字后剩下的数字按原左右次序将组成一个新的非负整数。编程对给定的 nnn 和…...

神经网络联合建模:分类与回归任务的高效解决方案

1. 神经网络在分类与回归联合任务中的应用价值在真实业务场景中,我们常常遇到需要同时预测离散类别和连续数值的问题。比如电商平台既要判断用户是否会点击商品(分类),又要预估点击后的停留时长(回归)&…...

深度解析:wxauto微信自动化框架的架构设计与实现原理

深度解析:wxauto微信自动化框架的架构设计与实现原理 【免费下载链接】wxauto Windows版本微信客户端(非网页版)自动化,可实现简单的发送、接收微信消息,简单微信机器人 项目地址: https://gitcode.com/gh_mirrors/w…...

DXVK 2.7.1:如何实现Linux游戏性能的终极突破与Vulkan图形转换技术

DXVK 2.7.1:如何实现Linux游戏性能的终极突破与Vulkan图形转换技术 【免费下载链接】dxvk Vulkan-based implementation of D3D8, 9, 10 and 11 for Linux / Wine 项目地址: https://gitcode.com/gh_mirrors/dx/dxvk 在Linux平台上运行Windows游戏一直面临着…...

游戏服务器分布式架构实战:cellmesh框架核心原理与应用

1. 项目概述:一个为游戏而生的分布式服务框架如果你在游戏服务器开发领域摸爬滚打过几年,大概率会对“服务拆分”和“通信治理”这两个词又爱又恨。爱的是,当你的在线玩家从几百人增长到几十万、上百万时,单体服务器架构必然崩溃&…...

SDF 文件深度解析

从格式解读到反标注实战,一文搞懂时序仿真的灵魂文件| 数字后端工程师必读 | STA & GLS 实战 | 避坑指南 |01 你的门级仿真,有没有踩过这些坑?做了几年芯片,最怕的不是综合报warning,也不是PR跑不完——而是门级仿…...

VSCode 2026远程文件同步提速412%:实测SSHFS+Rsync+DeltaFS三引擎协同优化方案

更多请点击: https://intelliparadigm.com 第一章:VSCode 2026远程文件同步提速412%:核心突破与技术背景 VSCode 2026 引入全新自适应增量同步引擎(AISE),彻底重构 Remote-SSH 和 Dev Containers 的文件同…...

nodejs 下国内最流行的框架

在国内企业、互联网公司、中小项目中,Node.js 最主流、使用最广泛的框架是:Express 和 NestJS,二者分属不同场景,占据绝对主导地位。一、按场景划分的主流排名1. 老牌通用王者:Express地位:国内最普及、生态…...

VCAM虚拟摄像头:安卓Xposed框架下的终极摄像头替换解决方案

VCAM虚拟摄像头:安卓Xposed框架下的终极摄像头替换解决方案 【免费下载链接】com.example.vcam 虚拟摄像头 virtual camera 项目地址: https://gitcode.com/gh_mirrors/co/com.example.vcam 在移动应用开发和内容创作领域,摄像头功能的重要性不言…...

缠论量化分析终极秘籍:从理论到实战的完整智能化解决方案

缠论量化分析终极秘籍:从理论到实战的完整智能化解决方案 【免费下载链接】Indicator 通达信缠论可视化分析插件 项目地址: https://gitcode.com/gh_mirrors/ind/Indicator 在金融市场的波动中,技术分析工具的质量直接影响着交易决策的精准度。今…...

字节开源trae-agent:Rust构建的高性能服务网格数据平面解析

1. 项目概述:一个现代服务网格数据平面的诞生最近在梳理服务网格生态时,我注意到了字节跳动开源的trae-agent。这个名字乍一看有点陌生,不像Envoy、Linkerd-proxy那样如雷贯耳,但深入了解后,我发现它代表了一种非常务实…...

AI老照片修复:Stable Diffusion技术实践与伦理考量

1. 老照片修复的艺术与技术挑战老照片承载着历史的记忆,但时间的流逝往往让这些珍贵的影像变得模糊、褪色甚至破损。作为一名长期从事数字影像修复的从业者,我深知传统修复方法需要耗费大量时间精力——在Photoshop中手动修复一张严重破损的照片可能需要…...

[嵌入式系统-267]:同一个型号的舵机如何支持Teacher模式和Student模式?如何设置?

在机械臂的“主从控制”(Teacher-Student)系统中,同一个型号的舵机完全可以同时支持两种模式。核心原理在于:模式不是由舵机硬件决定的,而是由控制器(主控板)赋予它的“角色”决定的。这就好比同…...

[嵌入式系统-266]:嵌入式系统软件常见十大难题与排查方法

在嵌入式开发中,我们常说“硬件是躯体,软件是灵魂”,但当灵魂出窍(程序跑飞)或者躯体僵硬(死机)时,排查工作往往令人头秃。结合最新的行业实战经验和经典理论,为你梳理了…...

[嵌入式系统-265]:什么是函数的可重入、什么是线程安全函数、什么是中断安全,举例说明

这三个概念是嵌入式和多线程编程中的基石,它们之间存在着严格的包含和递进关系。简单来说,它们的核心区别在于“在什么环境下被意外打断”以及“如何保护共享资源”。我们可以用一个形象的比喻来开场:可重入函数:像一个独行侠。他…...

从零实现C/C++内存管理库:轻量级内存泄漏检测与调试实践

1. 项目概述:一个极简内存管理库的诞生最近在整理一些C/C的老项目,发现很多代码里都散落着各种malloc和free,偶尔夹杂着new和delete。调试内存泄漏、野指针问题简直是一场噩梦,尤其是当项目规模稍大,或者多人协作时&am…...

深入解析Nuxt 3中的图标使用

在使用Nuxt 3开发应用时,图标的管理和使用是一个常见且关键的问题。本文将通过一个实际的例子,深入探讨如何在Nuxt 3应用中有效地管理和使用图标。 背景介绍 我们假设有一个Nuxt 3应用,采用了NuxtUI作为UI框架。为了避免图标名称的拼写错误和重复引用,我们创建了一个工具…...

基于PPO与CNN的DoomNet:从像素输入到游戏AI的深度强化学习实战

1. 项目概述:DoomNet,一个基于像素的强化学习智能体如果你对游戏AI或者深度强化学习感兴趣,那你大概率听说过DeepMind的Atari游戏AI,或者OpenAI的Dota 2智能体。这些项目通常需要庞大的计算资源和复杂的工程架构。今天我想分享一个…...

量子开发者的VSCode生死线,2026语法高亮失效?立即检测这4个隐藏配置项,错过将影响QPU编译精度!

更多请点击: https://intelliparadigm.com 第一章:量子开发者的VSCode生死线,2026语法高亮失效?立即检测这4个隐藏配置项,错过将影响QPU编译精度! 量子编程环境正经历一场静默崩溃:自2026年QDK…...

【VSCode 2026农业可视化插件首发指南】:5大核心能力+3类真实农田数据落地案例,仅限首批内测开发者获取

更多请点击: https://kaifayun.com 第一章:VSCode 2026农业可视化插件发布背景与核心定位 随着智慧农业加速落地,田间传感器、无人机遥感、气象站及IoT边缘设备每日产生TB级时空数据,但开发者长期受限于专业GIS工具门槛高、轻量级…...

机器学习算法核心六问:从原理到实战

1. 算法认知的六个黄金问题第一次接触机器学习算法时,我常被各种数学符号和术语淹没。直到导师告诉我:"任何算法本质上都是在回答六个核心问题。"这套方法帮我节省了数百小时的学习时间,现在我把这套方法论拆解给你。这六个问题就像…...

字节面试被问“Claude Code怎么做搜索”?答RAG后就没后续了

最近和在社区看到,有个求职者面试字节的时候,聊到了一些rag相关问题,正好这个求职者就说自己用过claude写代码,面试官就问他:那你知道Claude Code检索代码用的是什么方式吗?他说是RAG吧,现在不都…...

基于MCP协议的EVM区块链交互服务器:为AI智能体赋能Web3操作

1. 项目概述:为AI智能体打开区块链世界的大门 如果你正在构建一个AI智能体,并且希望它能像人类开发者一样,自由地查询以太坊上的余额、读取智能合约的状态,甚至帮你执行一笔代币转账,那么你很可能需要一个桥梁来连接A…...

RAG 实战:给 AI 接上私有知识库的完整方案

上一篇我们聊了 Agent 动态路由——任务交接时怎么把控流向。这次换个方向,聊一个大家问得最多的问题:怎么让 AI 能回答你自己公司的文档、产品手册、内部 Wiki? 你可能试过直接把文档塞进 System Prompt,结果 token 超限了。你也…...