Floyd最短路径算法
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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循环的嵌套的顺序:我们可能随手就会写出这样的程序,但是仔细
考虑的话,会发现是有问题的。
感谢您的阅读,祝您生活愉快。