更弱智的算法学习 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 阅读更多 →

最新新闻

OpenCV 4.x LBPH 人脸识别实战:3步完成采集、训练与实时识别(附置信度调优)

OpenCV 4.x LBPH 人脸识别实战:3步完成采集、训练与实时识别(附置信度调优)

OpenCV 4.x LBPH 人脸识别实战:3步完成采集、训练与实时识别(附置信度调优)人脸识别技术正逐渐渗透到安防、金融、零售等各个领域。作为计算机视觉的基础应用之一,基于LBPH(Local Binary Patterns Histograms&#xff…

2026/7/8 23:40:56 阅读更多 →
I3D 与 TimeSformer 对比评测:3D CNN 与 Transformer 在 Kinetics-400 上的 5 项关键指标

I3D 与 TimeSformer 对比评测:3D CNN 与 Transformer 在 Kinetics-400 上的 5 项关键指标

I3D 与 TimeSformer 深度对比:3D CNN 与 Transformer 在视频理解中的性能博弈1. 模型架构与设计哲学I3D(Inflated 3D ConvNet)和TimeSformer代表了视频理解领域两种截然不同的技术路线。I3D基于3D卷积神经网络,通过扩展2D卷积核到…

2026/7/8 23:38:56 阅读更多 →
傅里叶变换与积分图像:OpenCV 4.8 中3种频域/空域加速技术的原理与性能实测

傅里叶变换与积分图像:OpenCV 4.8 中3种频域/空域加速技术的原理与性能实测

傅里叶变换与积分图像:OpenCV 4.8中频域/空域加速技术深度解析引言在计算机视觉领域,图像处理的速度和效率直接影响着算法的实用性。当面对高分辨率视频流或大规模图像数据集时,传统逐像素处理方式往往成为性能瓶颈。OpenCV作为最广泛使用的计…

2026/7/8 23:38:56 阅读更多 →
3种工业机器视觉颜色识别方案对比:传统HSV、Blob分析与深度学习YOLOv8

3种工业机器视觉颜色识别方案对比:传统HSV、Blob分析与深度学习YOLOv8

工业机器视觉颜色识别三大技术路径深度评测:从传统算法到YOLOv8的实战选型指南在自动化产线上,一块电路板正以每秒3米的速度通过检测工位。传统HSV算法因反光误判为缺陷导致停机,而改用YOLOv8深度学习模型的生产线却准确捕捉到了真正的焊点缺…

2026/7/8 23:36:55 阅读更多 →
3种机器视觉颜色识别方案对比:传统HSV、Blob分析与YOLOv8,实测FPS与精度

3种机器视觉颜色识别方案对比:传统HSV、Blob分析与YOLOv8,实测FPS与精度

3种机器视觉颜色识别方案对比:传统HSV、Blob分析与YOLOv8,实测FPS与精度 在工业自动化与智能制造的浪潮中,颜色识别技术正成为生产线上的"火眼金睛"。从汽车零部件色差检测到食品包装印刷质量把控,再到药品标签颜色验证…

2026/7/8 23:36:55 阅读更多 →
Browser Use 实战指南:AI 智能体浏览器自动化

Browser Use 实战指南:AI 智能体浏览器自动化

随着 AI 智能体开始从内容生成走向任务执行,浏览器自动化成为连接 AI 与 Web 应用的重要入口。但传统自动化工具依赖固定脚本和页面结构,当网站频繁更新或交互流程复杂时,维护成本不断增加。Browser Use 通过结合大语言模型和浏览器控制能力&…

2026/7/8 23:32:52 阅读更多 →

日新闻

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 阅读更多 →

月新闻