使用堆实现 Prim 的 MST
从一个顶点开始扩展树
使用堆实现 Prim 的 MST 是 CoddyKit 上的免费 Coding Interview Prep 课时。 这是第 4 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Coding Interview Prep 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Coding Interview Prep 课程共包含 4 节课。
通往 MST 的另一条路径
Prim 算法同样可以找到最小生成树,但它是从一个连通块向外扩展,而不是先对所有边进行排序。🌱
从一个顶点开始扩展
请选择任意一个起始顶点,并将其标记为已访问。树从一个节点开始,每次通过一条边逐步扩展。
visited = [False] * n边界的概念
每一步中,您都要查看从树连接到外部的所有边。Prim 算法始终选择这些边界边中最便宜的一条。
用堆选出最小值
最小堆可以快速找到最便宜的边界边。每一轮将候选边压入堆中,并弹出权重最小的边。
import heapq
heap = [(0, start)]弹出最便宜的边
请从堆中弹出最小的元素。它会提供权重以及下一个应以最低成本连接到扩展中树的顶点。
w, u = heapq.heappop(heap)跳过过时的元素
一个顶点可能会多次出现在堆中。如果弹出的顶点已经访问过,请直接忽略它并再次弹出元素。
if visited[u]:
continue添加并扩展
将弹出的顶点标记为已访问,并把它的权重加入总权重。然后将它的每条出边压入堆中,供后续步骤使用。
visited[u] = True
total += w
for wt, v in adj[u]:
heapq.heappush(heap, (wt, v))重复直到完成
不断弹出元素并扩展,直到每个顶点都已访问。此时累积的总权重就是最小生成树的权重。
运行时间
每条边最多压入一次、弹出一次,因此基于堆的 Prim 算法运行时间为O(E log V),与 Kruskal 算法相当。
Prim 算法与 Kruskal 算法
对于使用邻接表表示的稠密图,请使用Prim 算法;如果已经拥有普通的边列表,则使用 Kruskal 算法。两者得到的 MST 权重相同。
它看起来像 Dijkstra 算法
堆循环与Dijkstra 算法很相似,但这里比较的是原始边权重,而不是路径距离。识别出这种模式可以节省编码时间。⚡
快速检查
请回忆 Prim 算法每一轮如何选择下一条边。
回顾
您使用Prim 算法构建了 MST:从任意位置开始,使用最小堆添加最便宜的边界边,并跳过过时的访问记录。做得很好!🎉
常见问题解答
「使用堆实现 Prim 的 MST」课时是免费的吗?
是的 — 「使用堆实现 Prim 的 MST」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Coding Interview Prep 课程的其余内容,请升级到 CoddyKit PRO。 Coding Interview Prep 课程共包含 4 节课。
「使用堆实现 Prim 的 MST」这节课中我会学到什么?
从一个顶点开始扩展树 你通过在浏览器中直接运行的动手代码来练习 Coding Interview Prep,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 Coding Interview Prep 需要有经验吗?
无需任何先前经验。CoddyKit 上的 Coding Interview Prep 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 4 节课,共 4 节。
「使用堆实现 Prim 的 MST」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 Coding Interview Prep 课中编写并运行代码吗?
能。每节 Coding Interview Prep 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。
此课程中的所有课时
- 带路径压缩的 DSU
- 按秩合并与连通分量
- Kruskal 最小生成树
- 使用堆实现 Prim 的 MST