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

30|最短路径:弗洛伊德(Floyd)算法与乘车费用最少的问题

你好,我是王健伟。
上节课我和你分享了用迪杰斯特拉(Dijkstra)算法求解最短路径。除此之外,还有一个求解最短路径的方法——佛洛依德(Floyd)算法。
那他们有什么不同吗?
如果说迪杰斯特拉算法比较适合一次性求某个顶点到其他各个顶点的最短路径信息,那么这节课所讲的佛洛依德算法往往比较适合求某个顶点到另外一个顶点的最短路径信息。
此外,迪杰斯特拉算法是不断计算从开始顶点到其他各个顶点的最短距离。而佛洛依德算法是通过从开始顶点到目标顶点之间不断增加新的顶点进行试探,看是否开始顶点和目标顶点之间的路径变短来求解最短路径的。

佛洛依德(Floyd)算法详解

这个算法是美国的一位计算机科学家罗伯特·弗洛伊德提出的,用于求解每一对顶点之间的最短路径。
这个算法实现的大致思路是什么呢?
那就是对任意一对顶点之间的最短路径的计算,都要进行|V|次试探。那么,每次试探都向图中加入一个新顶点,再去比较加入这个顶点之后这对要求解的顶点之间的最短路径是否变得更短,如果更短,则这条路径被采纳。以此类推,经过|V|次比较后,最后必然能够得到要求解的顶点之间的最短路径。
这里以图 1 所示的带权值有向图为例来讲解这个算法。图中同时展示了存储图中数据的邻接矩阵,为描述方便,我也标示出了每个顶点对应的下标。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

弗洛伊德算法是一种用于求解图中每一对顶点之间最短路径的算法。与迪杰斯特拉算法不同,弗洛伊德算法适合求解某个顶点到另一个顶点的最短路径信息。该算法通过不断试探加入新顶点的方式,比较路径长度是否变短来求解最短路径。文章详细描述了算法的步骤,以及如何利用算法求解最短路径的具体过程。通过示例图和编程思路,读者可以清晰了解弗洛伊德算法的实现和应用。文章通过具体的步骤和示例,帮助读者深入理解算法的原理和实际运用,为读者提供了一种求解最短路径的有效方法。 弗洛伊德算法的实现思路包括设置存储最短路径长度信息的二维数组和存储最短路径上的中间点的二维数组。通过向图中加入顶点并进行比较,最终得到顶点之间的最短路径。文章还提供了弗洛伊德算法的相关源码,以及如何利用该算法求解顶点之间的最短路径。通过详细的代码分析和执行结果展示,读者可以更好地理解算法的实现细节和时间复杂度。 总的来说,本文通过深入讲解弗洛伊德算法的原理、实现和应用,为读者提供了一篇全面而实用的技术文章。读者可以从中获得对算法的深入理解,以及如何在实际项目中应用该算法解决问题的指导。

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

全部留言(1)

  • 最新
  • 精选
  • Bruder_Jin
    【思考题】 (1)弗洛伊德算法 ①是一种动态规划算法,通过比较任意两点之间的距离来不断更新距离矩阵,直到求得任意两点之间的最短路径。 ②具体实现过程中,弗洛伊德算法需要先构建出邻接矩阵表示图的连接情况,然后利用两个循环嵌套的方式,遍历每一个节点,同时更新任意两点之间的距离。 ③该算法的时间复杂度为 O(N^3),适用于较小的图。(N即顶点个数) (2)迪杰斯特拉算法 ①是一种贪心算法,通过从起点开始遍历图中的每个节点,找出距离起点最近的节点,并将其加入到最短路径集合中,然后以该节点为基础,更新起点到其他节点的距离。 ②具体实现过程中,迪杰斯特拉算法需要利用一个距离矩阵和一个 visited 数组来表示节点之间的距离和是否被访问过。 ③该算法的时间复杂度为 O(N^2),适用于较大的图。(N即顶点个数)
    2023-07-19归属地:广东
    1
收起评论
显示
设置
留言
1
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部