[算法]Floyd-Warshall算法理解

来源:互联网 发布:大数据对旅游业的影响 编辑:程序博客网 时间:2024/04/30 09:21

关于弗洛伊德算法,各种资料都有介绍(如Wiki:https://zh.wikipedia.org/wiki/Floyd-Warshall%E7%AE%97%E6%B3%95),但是有一点疑问一直困惑了我很久,知道今天才想明白哈(感谢学长帮助~)。

图的有关信息存储在邻接矩阵中,弗洛伊德算法大体上是尝试找各个中转点,看能否减少顶点与顶点间的路径,以计算出任意两个顶点之间的路径长度。尝试各个中转站的步骤一般都在最外层的for循环中,而且一般是从小到大依次遍历。我之前一直感觉,这种遍历方式只能找其中一部分遍历路径的最小值。举个例子,我当初认为,从顶点1到顶点5,我们通过这种方法找到类似 1-2-5;1-3-5;1-2-4-5这种路径,路径中的顶点必须从小到大依次排列。那么有一些路径如1-3-2-5就无法遍历的到。(因为我感觉for循环的最外层是从1到n,那么中间点只能从小到大排列)困惑了我好久……今天与学长交流才明白,弗洛伊德算法是没有问题的(废话……),应该这样理解:随着for循环最外层的中转站依次遍历,那么在该次中转的时候(比如k),每一个中转站已经是包含是否经过前(k-1)个中转站的最短路径了,所以遍历到最后,一定是正确答案。
不知道我讲明白没有……举个例子,假如说我想看看1-3-2-5这种路径方式,那我一定是在尝试通过3中转站的时候进行的。此时我们会计算1-3,3-5的路径之和,然而3-5这条路径已经包含了3-2-5这种可能(尽管3-5不一定非要经过2这个中转站,比如还可能是3-1-5,但绝对不可能是3-4-5,因为这个时候最外层的中转站只遍历到3)。那么以此类推,当最外层的中转站遍历到最后,各个矩阵中存储的一定是两顶点间的最短路径。

0 0