最短路径之Dijkstra算法和Floyd-Warshall算法

Posted 数据结构与算法那些事儿

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了最短路径之Dijkstra算法和Floyd-Warshall算法相关的知识,希望对你有一定的参考价值。

最短路径算法

最短路径算法通常用在寻找图中任意两个结点之间的最短路径或者是求全局最短路径,像是包括Dijkstra、A*、Bellman-Ford、SPFA(Bellman-Ford的改进版本)、Floyd-Warshall、Johnson、BFS等等,这里要集中介绍DijkstraFloyd,前者用来处理任意两个结点之间的最短路径,后者处理图中所有的最短路径。


Dijkstra算法

理解


其思想为,我们首先纪录下每个点到原点的距离,这个距离会在每一轮遍历的过程中刷新。每一个结点到原点的最短路径是其前驱结点到原点的最短路径加上前驱结点到当前结点的路径和。

我们以下面这幅图片为例,假定起始结点为1,求该结点到其余各个结点的最短路径。

执行步骤为:


步骤 描述 前驱结点
1 将当前结点到其它结点的路径都初始化为无穷大
2 依次计算每个结点的路径长度,此时可以获得结点1到其它的结点2、3、4、5、6的路径长度为[7, 9, ∞,∞,14]`,取其中最小的值7,结点2作为前驱结点
3 此时通过结点2可以到达结点4和5,并且其路径等于起始结点到前驱结点的路径加上前驱结点到目标结点的路径长度,因此此时结点1到其它结点3、4、5、6的路径长度为[17, 22, ∞, ∞],此时将现在的路径长度和之前的路径长度进行比较,取对应的较小值,得到最短距离[9, 22, ∞, 14],取其最小值9,结点3更新成前驱结点 2
4 同样的道理,此时结点1到其它的结点4、5、6的路径长度为[20, ∞, 11],和之前的路径长度进行比较,得到最短距离[20, ∞, 11],取最小值11,结点6作为前驱结点 3
5 同样的道理,得到结点1到其它的结点4, 5的路径长度为[20, 20],和之前对比,最短距离更新成[20,20] 6
6 因为此时剩下了两个相等路径长度的结点,取任意一个结点,结果都是一样的,所以取哪个都可以


其伪函数如下:

最短路径之Dijkstra算法和Floyd-Warshall算法


其中的Extract_Min为提取最小值。


实现


最短路径之Dijkstra算法和Floyd-Warshall算法

最短路径之Dijkstra算法和Floyd-Warshall算法


Floyd

理解


其原理为:假定存在某个结点k在结点i和结点j之间,如果i和j之间的路径长度大于经过k到,则将其距离更新成经过结点k的路径长度。因此在实现中使用三个循环即可,但是要注意循环的顺序,最外层是结点k的遍历,这样可以避免i和j的遍历过早的把最短路径给定下来。

最短路径之Dijkstra算法和Floyd-Warshall算法



结果为:


实现


以上是关于最短路径之Dijkstra算法和Floyd-Warshall算法的主要内容,如果未能解决你的问题,请参考以下文章

最短路径之Dijkstra算法

[516数据]R语言:最短路径之Dijkstra算法

最短路径之Dijkstra算法

【数据结构】最短路径之迪杰斯特拉(Dijkstra)算法与弗洛伊德(Floyd)算法

数据结构 - 单源最短路径之迪杰斯特拉(Dijkstra)算法详解(Java)

(王道408考研数据结构)第六章图-第四节4:最短路径之迪杰斯特拉算法(思想代码演示答题规范)