如今的Floyd warshall算法是改进的Floyd,时间复杂度为O(n**3),现在也被主流称为的Floyd算法。
算法描述
Floyd-Warshall算法是在Floyd算法基础上的一个扩展,它可以处理带有负权边的图,而Floyd算法无法处理负权边。Floyd-Warshall算法通过动态规划的方式计算图中所有节点之间的最短路径。与单源最短路径算法(如Dijkstra或Bellman-Ford)不同,Floyd-Warshall算法是一种全源最短路径算法,因为它同时考虑了图中所有节点之间的路径。
算法流程
1. 初始化
(1) 创建一个二维数组dist,其中dist[i][j]表示节点i到节点j的最短路径长度。如果节点i和节点j之间没有直接连接的边,则dist[i][j]被设为无穷大(或一个足够大的值)。
(2) 对于每一条边(u,v),将dist[u][v]设置为边的权值。
2. 动态规划更新
(1) 对于每一个节点k,检查所有节点对(i, j),这里的k充当中间节点,检查是否存在一条路径从i经过k到达j而比当前已知的路径更短。
(2) 更新规则如下:dist[i][j] = min(dist[i][j], dist[i][k]+dist[k][j])
3. 迭代更新
重复上述动态规划步骤,逐步更新所有节点对之间的最短路径,直到所有节点都被考虑过为止。
4. 结果
当算法完成时,矩阵dist中存储的就是图中所有节点之间的最短路径长度。
算法样例
(1) 矩阵初始值为
(2) 接着第一次迭代:v1到v2之间的最短路径,比较v1-v2与v1-v3-v2,v1-v4-v2,其余点之间类似可以得到v4-v3>v4-v1-v3,得到
(3) 类似经过四次迭代可以得到最后:
(4) 输出结果
算法程序
暂无(有时间写)