更弱智的算法学习 day57
Prim算法是一种用于求解最小生成树的经典贪心算法它从一个顶点开始逐步扩展生成树每次选择连接当前生成树与图其余部分的最小权边直到所有顶点都被包含在内。下面详细解释其原理、步骤和Python实现。算法核心思想Prim算法基于贪心策略每一步都选择当前看来最优的边。其核心思想是维持两个顶点集合一个是最小生成树顶点集U另一个是尚未加入生成树的顶点集V-U。算法不断寻找连接这两个集合的最小权边将该边及其在V-U中的顶点加入最小生成树。算法步骤如下表所示步骤操作描述​1​初始化任选一个顶点作为起始点加入集合U。此时U中只有一个顶点V-U包含其余顶点。​2​​查找最小边​在所有连接U和V-U的边中选择权值最小的边(u, v)其中u∈U, v∈V-U。​3​​扩展生成树​将顶点v加入集合U边(u, v)加入最小生成树边集。​4​​重复​重复步骤2和3直到U包含所有顶点即UV此时最小生成树构建完成。第一步初始化v, e list(map(int, input().strip().split())) graph [[10001] * (v1) for _ in range(v1)] for _ in range(e): x, y, w list(map(int, input().strip().split())) graph[x][y] w graph[y][x] w # 因为是无向图需要对称赋值 visited [False] * (v 1) # 标记顶点是否已加入生成树 minDist [10001] * (v 1) # 记录每个顶点到当前生成树的最小距离graph使用邻接矩阵表示图。10001被用作无穷大的近似值表示初始时顶点间不可达。visited初始时所有顶点都未访问。minDist初始时所有顶点到生成树的距离为10001无穷大。第二步启动生成树代码的主循环for _ in range(1, v 1)会执行v次。​第一次循环具有特殊的启动作用。当第一次进入循环时所有visited[j]均为False所有minDist[j]均为10001。因此第一个被选中的顶点cur是编号为1的顶点因为索引从1开始且min_val初始为10002第一个顶点j1的minDist[1]是10001满足条件。随后执行visited[cur] True意味着顶点1被选为生成树的根节点。接下来的循环是关键的数据准备for j in range(1, v 1): if visited[j] False and minDist[j] graph[cur][j]: minDist[j] graph[cur][j]这段代码更新了所有未被访问的顶点j到当前生成树目前只有顶点1​​ 的距离。如果顶点j与顶点1之间有边即graph[1][j]小于10001那么minDist[j]就被更新为这条边的权值。这为下一轮选择新的顶点做好了准备第三步循环构建生成树从第二次循环开始算法进入标准流程​选择新顶点​min_val 10002 cur -1 for j in range(1, v 1): if visited[j] False and minDist[j] min_val: cur j min_val minDist[j]这部分代码遍历所有未访问顶点找出minDist值最小的那个顶点cur。这个minDist[cur]对应的边就是连接已访问集合和未访问集合的权值最小的边。找到后将cur标记为已访问。​更新距离​for j in range(1, v 1): if visited[j] False and minDist[j] graph[cur][j]: minDist[j] graph[cur][j]在将新顶点cur加入生成树后生成树集合扩大了。这时需要检查对于所有未被访问的顶点j新加入的顶点cur是否给它们提供了一条更短的通往生成树的路径​即graph[cur][j]是否小于它们当前记录的最小距离minDist[j]。如果是则更新minDist[j]为这条更短边的权值。第四步计算总权重并输出ans 0 for i in range(2, v 1): # 注意从2开始 ans minDist[i] print(ans)循环结束后minDist[i]i从2到v存储的就是各个顶点除根节点外加入生成树时所带来的那条最小边的权值。将它们求和即得到最小生成树的总路径长度。​为什么从2开始累加​​ 因为顶点1是根节点它加入生成树时没有引入边minDist[1]在第一次循环后被置为0但未被计入总和。从顶点2开始每个顶点加入时对应的最小边权值都被正确记录在minDist中。核心逻辑与示例为了直观地理解下表模拟了算法在一个简单图上的前几步操作假设图有顶点1,2,3,4边权如下1-2:2, 1-3:4, 2-3:1, 3-4:3。循环次数已选顶点cur当前visited集合更新后的minDist数组索引1-4本轮选择依据最小边初始-{}[10001, 10001, 10001, 10001]-第1次1{1}[0, 2, 4, 10001]选择顶点1作为根第2次2{1, 2}[0, 2, 1, 10001]边(1,2)权2第3次3{1, 2, 3}[0, 2, 1, 3]边(2,3)权1第4次4{1, 2, 3, 4}[0, 2, 1, 3]边(3,4)权3最终总权重ans minDist[2] minDist[3] minDist[4] 2 1 3 6。时间复杂度该实现的时间复杂度为 ​O(V²)​​。这是因为外层循环v次内层有两个顺序执行的循环各循环v次。这种复杂度在顶点数V不大或图非常稠密边数E接近V²时是可行的。对于稀疏图可以使用优先队列最小堆进行优化将时间复杂度降至 ​O(E log V)​克鲁斯卡尔算法是求解最小生成树的经典算法它采用贪心策略通过每次选择权值最小的边并确保不形成环路来构建最小生成树。以下是对你提供的Kruskal算法Python代码的详细解析。算法核心思想Kruskal算法的核心是按边权升序处理避免成环。其步骤如下步骤操作描述​1​将图中所有边按权值从小到大排序。​2​初始化一个空的边集用于存放最小生成树的边。​3​遍历排序后的边若当前边加入生成树不会形成环则将其加入。​4​重复步骤3直到生成树中包含V-1条边V为顶点数。算法的关键在于高效判断是否成环这通过并查集​ 数据结构实现。代码结构解析1. 并查集数据结构并查集通过find和join操作管理节点的连通性是避免环路的核心。n 10001 # 预设最大节点数 father list(range(n)) # 初始化父节点数组 def init(): global father father list(range(n)) # 重置父节点为自身 def find(u): if u ! father[u]: father[u] find(father[u]) # 路径压缩 return father[u] def join(u, v): u find(u) v find(v) if u ! v: father[v] u # 合并两个集合​路径压缩​在find过程中将节点直接指向根节点降低后续查询复杂度。​集合合并​join操作将两个节点所属集合合并若根节点不同则不会形成环。2. Kruskal算法主体def kruskal(v, edges): edges.sort(keylambda edge: edge.val) # 按边权排序 init() # 初始化并查集 result_val 0 # 存储最小生成树总权值 for edge in edges: x find(edge.l) y find(edge.r) if x ! y: # 若两个端点不属于同一集合 result_val edge.val # 累加权值 join(x, y) # 合并集合 return result_val​排序边​使用Python内置排序时间复杂度为O(E log E)。​贪心选择​遍历边仅当边两端点不属于同一连通分量即x ! y时将其加入生成树。

相关新闻

【网安毕设项目】基于深度学习的恶意钓鱼邮件检测系统

【网安毕设项目】基于深度学习的恶意钓鱼邮件检测系统

摘要:本文设计并实现了一个基于深度学习的钓鱼邮件自动检测系统。系统采用BiLSTM模型对邮件文本进行语义分析,结合文本预处理、词向量表示等技术,实现钓鱼邮件与正常邮件的自动分类。项目构建了完整的数据处理流程和GUI界面,包含数…

2026/7/8 22:54:44 阅读更多 →
Thinkphp和Laravel院课表调课管理系统_2n594_

Thinkphp和Laravel院课表调课管理系统_2n594_

目录 功能概述技术架构核心模块系统特点扩展性能 项目开发技术介绍PHP核心代码部分展示系统结论源码获取/同行可拿货,招校园代理 功能概述 Thinkphp和Laravel院课表调课管理系统_2n594_是一个基于两种流行PHP框架(ThinkPHP和Laravel)开发的课程管理解决…

2026/7/7 4:35:16 阅读更多 →
宏智树 AI AI-PPT 封神!开题 / 答辩 / 汇报一键拿捏,告别排版内耗

宏智树 AI AI-PPT 封神!开题 / 答辩 / 汇报一键拿捏,告别排版内耗

作为深耕论文写作科普的博主,后台最扎心的求助不是写论文,而是 “PPT 改了 8 版还被导师批不专业”:开题报告 PPT 逻辑混乱,评委抓不住重点;答辩 PPT 堆满文字,字体配色杂乱无章;工作汇报 PPT 图…

2026/7/3 16:24:33 阅读更多 →

最新新闻

《伤寒论》398条方剂数据库构建:Python 爬虫抓取与 10 类方证关系分析

《伤寒论》398条方剂数据库构建:Python 爬虫抓取与 10 类方证关系分析

《伤寒论》398条方剂数据库构建:Python爬虫抓取与10类方证关系分析中医药古籍数字化是当前中医药信息化建设的重要方向。《伤寒论》作为中医四大经典之一,其398条条文蕴含着丰富的临床经验和辨证论治思想。本文将详细介绍如何利用Python技术构建《伤寒论…

2026/7/8 22:52:30 阅读更多 →
Twitter API v2 数据采集实战:5万用户样本的 Shadowban 回归分析模型构建

Twitter API v2 数据采集实战:5万用户样本的 Shadowban 回归分析模型构建

Twitter API v2 数据采集与 Shadowban 分析实战:从数据获取到模型构建社交媒体平台的算法治理机制一直是开发者社区关注的焦点,其中"影子禁令"(Shadowban)作为平台内容审核的重要手段,其运作机制和影响因素值得深入研究。本文将基于…

2026/7/8 22:52:30 阅读更多 →
OpenCV 4.8 图像压缩实战:3种无损编码算法对比与Python实现

OpenCV 4.8 图像压缩实战:3种无损编码算法对比与Python实现

OpenCV 4.8 图像压缩实战:3种无损编码算法对比与Python实现图像压缩技术是计算机视觉领域的基础能力之一,尤其在嵌入式设备和实时视频传输场景中,高效的压缩算法直接影响系统性能。本文将深入解析游程编码、哈夫曼编码和LZW三种经典无损压缩算…

2026/7/8 22:48:29 阅读更多 →
LabVIEW弹性VI标签消失问题

LabVIEW弹性VI标签消失问题

问题背景 LabVIEW 2020引入的Malleable VI(弹性VI)功能是一项革命性特性,允许创建泛型化的子VI,使其能够根据输入数据类型自动适配不同的实现路径。然而,许多在实际使用中报告了一个令人困扰的现象:Mallea…

2026/7/8 22:48:29 阅读更多 →
拉普拉斯算子图像边缘检测实战:Python+OpenCV 4.x 实现3种卷积核对比

拉普拉斯算子图像边缘检测实战:Python+OpenCV 4.x 实现3种卷积核对比

拉普拉斯算子图像边缘检测实战:PythonOpenCV 4.x 实现3种卷积核对比在计算机视觉领域,边缘检测是一项基础而关键的任务。它能够从图像中提取出物体的轮廓和结构信息,为后续的图像分析、目标识别等高级任务奠定基础。拉普拉斯算子作为一种经典…

2026/7/8 22:48:29 阅读更多 →
TrollInstallerX:解锁iOS设备安装自由的一键式解决方案

TrollInstallerX:解锁iOS设备安装自由的一键式解决方案

TrollInstallerX:解锁iOS设备安装自由的一键式解决方案 【免费下载链接】TrollInstallerX A TrollStore installer for iOS 14.0 - 16.6.1 项目地址: https://gitcode.com/gh_mirrors/tr/TrollInstallerX 还在为iOS设备无法自由安装应用而烦恼吗?…

2026/7/8 22:48:29 阅读更多 →

日新闻

3大核心能力重塑《明日方舟》游戏体验:MAA自动化助手的革命性突破

3大核心能力重塑《明日方舟》游戏体验:MAA自动化助手的革命性突破

3大核心能力重塑《明日方舟》游戏体验:MAA自动化助手的革命性突破 【免费下载链接】MaaAssistantArknights 《明日方舟》小助手,全日常一键长草!| A one-click tool for the daily tasks of Arknights, supporting all clients. 项目地址: …

2026/7/8 0:00:48 阅读更多 →
MyBatis 批量操作深度优化——从 N+1 到批处理的全路径

MyBatis 批量操作深度优化——从 N+1 到批处理的全路径

MyBatis 批量操作深度优化——从 N1 到批处理的全路径 一、从"功能正确"到"性能可接受"——MyBatis 批量操作的三段式进化 MyBatis 在日常增删改查场景中几乎是无感的——实体映射直观、SQL 控制灵活。但当数据量从千级上升到十万级、百万级,许…

2026/7/8 0:00:48 阅读更多 →
工业负载控制方案:TPD2015FN与PIC18F45K22应用解析

工业负载控制方案:TPD2015FN与PIC18F45K22应用解析

1. 工业负载控制方案概述在工业自动化、电机驱动和照明控制等高需求场景中,可靠地控制电感和电阻负载是核心挑战之一。TPD2015FN作为东芝的8通道高端智能功率开关IC,配合PIC18F45K22微控制器,能够构建一套稳定、高效的负载控制系统。这套组合…

2026/7/8 0:02:48 阅读更多 →

周新闻

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱,支持下载视频、番剧等等各类资源 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools …

2026/7/8 16:14:06 阅读更多 →
威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型的陌生现状在忙碌疲惫的一天里,参与了关于混合后量子密码学的讨论,应付端点攻击找茬的人,还参与留言板讨论后,发现“威胁模型”对多数人仍是陌生概念,且多被当作时髦用语。有趣的相关画作有一幅由 Embyr 创作的…

2026/7/7 12:34:47 阅读更多 →
渗透测试入门指南:从零基础到实战环境搭建

渗透测试入门指南:从零基础到实战环境搭建

1. 从“看热闹”到“入门”:我理解的渗透测试到底是什么?每次看到新闻里说某个大公司的数据被“黑”了,或者某个网站被攻击导致服务瘫痪,你是不是和我一样,心里会冒出两个念头:一是“这黑客真厉害”&#x…

2026/7/8 16:59:55 阅读更多 →

月新闻