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| × |V| array of minimum distances initialized to ∞ (infinity)
2 for each vertex v
3 dist[v][v] ← 0
4 for each edge (u,v)
5

Floyd-Warshall算法是解决全源最短路径问题的算法,适用于有向图和负权图。该算法时间复杂度为O(N^3),空间复杂度为O(N^2)。它通过动态规划策略更新所有点对之间的最短路径,可以处理单源最短路径问题的推广。滚动数组优化可以减少空间需求。常见用于稠密图,与Johnson算法相比,对于稀疏图Johnson算法更优。
最低0.47元/天 解锁文章
1338

被折叠的 条评论
为什么被折叠?



