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;所有只要每个点作为中间点更新一遍就可以求得任意两点的最短路径;

原文地址:https://www.cnblogs.com/zdl2234/p/10359182.html