Floyd最短路径算法

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

Floyd最短路径算法
在图论中经常会遇到这样的问题,在一个有向图里,求出任意两个节点之间的最短距离。

我们在离散数学、数据结构课上都遇到过这个问题,在计算机网络里介绍网络层的时
候好像也遇到过这个问题,记不请了... 但是书本上一律采取的是Dijkstra算法,通过Dijkstra算法可以求出单源最短路径,然后逐个节点利用Dijkstra算法就可以了。

不过
在这里想换换口味,采取Robert Floyd提出的算法来解决这个问题。

下面让我们先把问
题稍微的形式化一下:
如果有一个矩阵D=[d(ij)],其中d(ij)>0表示i城市到j城市的距离。

若i与j之
间无路可通,那么d(ij)就是无穷大。

又有d(ii)=0。

编写一个程序,通过这个距离矩阵D,把任意两个城市之间的最短与其行径的路径找出来。

我们可以将问题分解,先找出最短的距离,然后在考虑如何找出对应的行进路线。


何找出最短路径呢,这里还是用到动态规划的知识,对于任何一个城市而言,i到j的最
短距离不外乎存在经过i与j之间的k和不经过k两种可能,所以可以令k=1,2,3,...,n(n是城市的数目),在检查d(ij)与d(ik)+d(kj)的值;在此d(ik)与d(kj)分别是目前为止所知道的i到k与k到j的最短距离,因此d(ik)+d(kj)就是i到j经过k的最短距离。

所以,若有d(ij)>d(ik)+d(kj),就表示从i出发经过k再到j的距离要比原来的i到j
距离短,自然把i到j的d(ij)重写为d(ik)+d(kj),每当一个k查完了,d(ij)就是目前
的i到j的最短距离。

重复这一过程,最后当查完所有的k时,d(ij)里面存放的就是i
到j之间的最短距离了。

所以我们就可以用三个for循环把问题搞定了,但是有一个问题
需要注意,那就是for循环的嵌套的顺序:我们可能随手就会写出这样的程序,但是仔细
考虑的话,会发现是有问题的。

感谢您的阅读,祝您生活愉快。

相关文档
最新文档