Floyd-Warshall算法(最短路)

Posted zdl2234

tags:

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

Flayd-Warshall算法是求任意两点之间的最短路径,也就是多源最短路径;

思路:任何最短路径两点之间的最短路径有两种情况,一是两点之间之间相连最短,二是通过k个中间点间接相连最短;(这其实是种动态规划的思想)

直接上代码:

 for(int k=1;k<=n;k++){//每循环一次,就可以通过k这个顶点更新任意两点之间的最短路径
        for(int i=1;i<=n;i++){
            for(itn j=1;j<n;j++){
                if(e[i][j]>e[i][k]+e[k][j])
                    e[i][j]>e[i][k]+e[k][j]
            }
        }
    }

刚开始看Flayd-Warshall算法是总是错误认为每次只能通过一个点更新,到最后也只是更新了只经过一个点到达的最短路径;其实不是的,例如要更新1跟4的最短路径时,正确的最短路径是1-2-3-4;当以2为中间点时会更新1-2-4和1-2-3;然后再以3为中间点,因为1到3已经更新为1-2-3,所以这时候以三为中间点的1-3-4其实是1-2-3-4;所有只要每个点作为中间点更新一遍就可以求得任意两点的最短路径;

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

Floyd-Warshall 算法:获得最短路径

Floyd-Warshall算法(最短路)

多源最短路径---Floyd-Warshall算法

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

Floyd-Warshall 算法返回具有相同权重的每条最短路径

单源最短路(bellman-ford算法+dijkstra算法)+任意两点最短路(floyd-warshall算法)