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

LeetCode Prim 算法题解

LeetCode Prim 算法题解

题目描述

Prim 算法是一种用于构建最小生成树的贪心算法。与 Kruskal 算法不同,Prim 算法从一个顶点开始,逐步扩展最小生成树,每次选择连接当前生成树和剩余顶点的最小权值边。

示例

对于以下加权图:

A --(2)-- B --(4)-- C | | | (1) (3) (1) | | | D --(5)-- E --(2)-- F

从顶点 A 开始,Prim 算法构建的最小生成树的边包括:A-D (1), A-B (2), B-E (3), E-F (2), F-C (1),总权值为 1+2+3+2+1=9。

解题思路

方法:Prim 算法

思路

  • Prim 算法的核心思想是从一个顶点开始,逐步扩展最小生成树,每次选择连接当前生成树和剩余顶点的最小权值边。
  • 具体步骤:
    1. 选择一个起始顶点,将其加入生成树。
    2. 初始化一个优先队列,用于存储连接当前生成树和剩余顶点的边。
    3. 从优先队列中取出权值最小的边,如果边的目标顶点不在生成树中,则将其加入生成树,并将与该顶点相关的边加入优先队列。
    4. 重复步骤 3,直到生成树包含所有顶点。

复杂度分析

  • 时间复杂度:O(E log V),其中 V 是顶点数,E 是边数。每次优先队列操作的时间复杂度为 O(log V),最多处理 E 条边。
  • 空间复杂度:O(E + V),需要存储图的邻接表和优先队列的信息。

代码实现

方法:Prim 算法

import heapq # Prim 算法 def prim(graph, start): # 获取所有顶点 vertices = set(graph.keys()) # 已加入生成树的顶点 mst_vertices = set([start]) # 生成树的边 mst_edges = [] # 总权值 total_weight = 0 # 优先队列,用于存储边(权值,起始顶点,目标顶点) priority_queue = [] # 初始化优先队列,将起始顶点的所有边加入 for neighbor, weight in graph[start].items(): heapq.heappush(priority_queue, (weight, start, neighbor)) while priority_queue and len(mst_vertices) < len(vertices): # 取出权值最小的边 weight, u, v = heapq.heappop(priority_queue) # 如果目标顶点不在生成树中 if v not in mst_vertices: # 将目标顶点加入生成树 mst_vertices.add(v) # 将边加入生成树 mst_edges.append((u, v, weight)) # 更新总权值 total_weight += weight # 将目标顶点的所有边加入优先队列 for neighbor, weight in graph[v].items(): if neighbor not in mst_vertices: heapq.heappush(priority_queue, (weight, v, neighbor)) return mst_edges, total_weight # 测试 def test_prim(): # 构建图结构(邻接表) graph = { 'A': {'B': 2, 'D': 1}, 'B': {'A': 2, 'C': 4, 'E': 3}, 'C': {'B': 4, 'F': 1}, 'D': {'A': 1, 'E': 5}, 'E': {'B': 3, 'D': 5, 'F': 2}, 'F': {'C': 1, 'E': 2} } # 测试从 A 出发的最小生成树 print("Minimum Spanning Tree edges:") mst_edges, total_weight = prim(graph, 'A') for u, v, weight in mst_edges: print(f"{u} - {v}: {weight}") print(f"Total weight: {total_weight}") # 输出: # Minimum Spanning Tree edges: # A - D: 1 # A - B: 2 # B - E: 3 # E - F: 2 # F - C: 1 # Total weight: 9 if __name__ == "__main__": test_prim()

测试用例

测试用例:最小生成树

输入:

A --(2)-- B --(4)-- C | | | (1) (3) (1) | | | D --(5)-- E --(2)-- F

输出:

Minimum Spanning Tree edges: A - D: 1 A - B: 2 B - E: 3 E - F: 2 F - C: 1 Total weight: 9

总结

Prim 算法是一种重要的图论算法,它可以用于构建最小生成树。通过贪心策略和优先队列,Prim 算法可以高效地找到权值之和最小的生成树。

Prim 算法的核心思想是:从一个顶点开始,逐步扩展最小生成树,每次选择连接当前生成树和剩余顶点的最小权值边。

掌握 Prim 算法的原理和实现,对于理解和解决图论相关问题非常重要。

http://www.jsqmd.com/news/712925/

相关文章:

  • 螺蛳粉包装设计公司哪家专业靠谱 速食螺蛳粉品牌包装升级首选哲仕设计 - 设计调研者
  • 2026年行业内专业的正品云南一机直销厂家推荐,数控车床/数控斜车/普通车床/云南车床/云南一机,正品云南一机企业推荐 - 品牌推荐师
  • GLM-4.1V-9B-Base入门指南:视觉理解模型Fine-tuning入门路径
  • 解密baidupankey:如何用AI技术秒级获取百度网盘提取码
  • ZooBot:基于SQLite与多通道架构的本地AI多智能体协作平台实战
  • QMCDecode终极指南:3步解锁QQ音乐加密格式,实现音乐自由
  • GetQzonehistory:3步搞定QQ空间历史说说备份,永久保存你的青春回忆
  • 2026年毕业论文AIGC率飘红?实测5个去AI痕迹核心手段,附保姆级工具清单 - 降AI实验室
  • Zotero插件市场:3分钟搞定插件安装,彻底告别手动下载烦恼 [特殊字符]
  • 如何一键备份你的QQ空间历史说说?GetQzonehistory终极指南
  • NVIDIA Profile Inspector多语言支持实战指南:让显卡优化工具服务全球用户
  • Transformer注意力下沉现象解析与优化策略
  • LeetCode 拓扑排序题解
  • 2026年3月钢琴搬家公司选哪家,跨省搬家/低价搬家/空调移机搬家/企业搬家/长途搬家,钢琴搬家公司哪家便宜又好 - 品牌推荐师
  • 四月二十八早上
  • 进化策略算法:原理、实现与优化技巧
  • OpenClaw Dashboard:构建AI Agent工作流的实时监控与控制中心
  • FanControl终极配置指南:3步实现Windows风扇精准温控
  • ChatDrug:基于大语言模型的对话式药物设计框架解析与实践
  • 深入解析自动化任务执行框架:从核心原理到生产实践
  • 如何在Blender中直接导入Rhino 3D文件?import_3dm插件完整解决方案
  • foo2zjs:Linux 打印驱动架构深度解析与高级配置指南
  • AlwaysOnTop:Windows系统高效窗口置顶工具完整指南
  • 如何通过底层硬件调试彻底释放AMD Ryzen处理器隐藏性能
  • CLUE框架:基于隐藏状态分析的LLM生成内容验证方法
  • Hydra开源情报收集框架:自动化渗透测试侦察实战指南
  • Qwen3.5-4B-AWQ惊艳案例:中文长文档理解+英文图表解析双语输出
  • 基于深度CNN的文本情感分析实战与优化
  • NVIDIA Profile Inspector完整指南:解锁显卡隐藏性能的5个简单步骤
  • Zapier与SmolAgents实现邮件智能分类的两种方案