Floyd-Warshall算法(英语:Floyd-Warshall algorithm),中文亦称弗洛伊德算法,是解决任意两点间的最短路径的一种算法,即全源最短路径问题(All-Pairs Shortest Paths Problem),可以正确处理有向图或负权的最短路径问题,同时也被用于计算有向图的传递闭包。
Floyd-Warshall算法的时间复杂度为O(N^3)[3],空间复杂度为O(N^2)。
解决单源最短路径问题的方案有 Dijkstra 算法和 Bellman-Ford 算法,对于全源最短路径问题可以认为是单源最短路径问题(Single Source Shortest Paths Problem)的推广,即分别以每个顶点作为源顶点并求其至其它顶点的最短距离。更通用的全源最短路径算法包括:
针对稠密图的 Floyd-Warshall 算法:时间复杂度为 O(V3);
针对稀疏图的 Johnson 算法:时间复杂度为 O(V2logV + VE);
原理:
Floyd-Warshall算法的原理是动态规划。
最外层一维空间可以省略,因为D[k]只与Dk-1]有关。在实际算法中,为了节约空间,可以直接在原来空间上进行迭代,这样空间可降至二维。
算法描述:
1 let dist be a |V| × |