快速上手 C++ 数据结构与算法
王健伟
《C++ 新经典》系列作者,资深 C++ 讲师
3224 人已学习
新⼈⾸单¥68
登录后,你可以任选4讲全文学习
课程目录
已完结/共 55 讲
结束语 (1讲)
快速上手 C++ 数据结构与算法
15
15
1.0x
00:00/00:00
登录|注册

27|最小生成树:如何用普里姆(Prim)算法解决修路费用最少的问题?

你好,我是王健伟。
前面我们已经讲解了图的概念、图的存储结构以及图的遍历问题。那么你可能非常想知道图都有哪些具体的实际用途。这节课,我就和你分享图的第一个实际用途——最小生成树
首先我们先一起看一看什么是最小生成树。

最小生成树

前面我们曾经展示过生成树:一个无向连通图的生成树是包含图中全部顶点的一个极小连通子图。
这里的极小,指的是边尽可能少但要保持连通。一个连通图可能会有多个生成树,生成树中如果有 n 个顶点,则必须有 n-1 条边,若减去一条边,则会变成非连通图,若增加一条边则图中就会存在回路。
好了,现在我们假设要在 n 个城市(顶点)之间修路(边)。通常来讲每两个城市之间都可以修一条路(无向完全图),这意味着 n 个城市最多可以修 条路。但是每修一条路都需要花费一定的资金,所以在每两个城市之间都修一条路是很不划算的。
要想让这 n 个城市连通,只需要修 n-1 条路即可,那么如何在这些可能的路线中选择 n-1 条以使总的资金花销最少呢?
图 1 是一个带权的无向图,你可以把图中的各个顶点看成是一座座城市。图中城市之间的连线对应的权值代表修一条连通这两个城市之间的道路所需要的资金。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

普里姆(Prim)算法是解决修路费用最少问题的一种经典算法,用于构建带权无向连通图的最小生成树。最小生成树是指边上权值之和最小的生成树,即修路费用最少的方案。本文介绍了最小生成树的概念和意义,并重点介绍了普里姆算法的实现过程。该算法通过逐步选择与当前生成树相连的权值最小的边,逐步构建最小生成树。相比其他算法,普里姆算法具有较高的效率和简单易懂的特点。文章通过实际案例和图示生动地展示了普里姆算法的应用过程和结果。此外,文章还提供了普里姆算法的实现代码,通过对邻接矩阵的存储方式和算法实现的详细介绍,读者可以快速了解最小生成树及普里姆算法的基本概念和应用,为进一步深入学习和应用提供了良好的基础。普里姆算法的时间复杂度为O($|V|^{2}$),即O($n^{2}$),适用于构造最小生成树时顶点数较少、边数较多的情况。 文章还介绍了普里姆算法的改进版本,提高了执行效率。通过引入lowcost权值信息数组和保存顶点对应下标信息的veridx数组,改进后的算法在执行效率上有所提升。此外,文章还提出了课后思考问题,引导读者思考现实生活中适合使用普里姆算法实现最小生成树来解决的问题。 总之,本文通过深入浅出的方式介绍了普里姆算法及其在构建最小生成树中的应用。读者可以从中快速了解算法的原理、实现方法以及适用场景,为进一步学习和应用提供了有益的指导。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《快速上手 C++ 数据结构与算法》
新⼈⾸单¥68
立即购买
登录 后留言

全部留言(2)

  • 最新
  • 精选
  • Se7en
    给个建议,把私有变量放类开头,这样方便阅读

    作者回复: 非常好的建议,非常感谢😁😁

    2023-07-10归属地:北京
  • Bruder_Jin
    城市景观规划和城市道路网络规划 都是 最小生成树的实际应用场景
    2023-07-10归属地:广东
收起评论
显示
设置
留言
2
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部