1.定义概览

Floyd-Warshall算法(Floyd-Warshall algorithm)是解决任意两点间的最短路径的一种算法,可以正确处理有向图或负权的最短路径问题,同时也被用于计算有向图的传递闭包。Floyd-Warshall算法的时间复杂度为O(N3),空间复杂度为O(N2)。

2.算法原理

Floyd算法是一个经典的动态规划算法。用通俗的语言来描述的话,首先我们的目标是寻找从点i到点j的最短路径。从动态规划的角度看问题,我们需要为这个目标重新做一个诠释(这个诠释正是动态规划最富创造力的精华所在)

从任意节点i到任意节点j的最短路径不外乎2种可能,1是直接从i到j,2是从i经过若干个节点k到j。所以,我们假设Dis(i,j)为节点u到节点v的最短路径的距离,对于每一个节点k,我们检查Dis(i,k) + Dis(k,j) < Dis(i,j)是否成立,如果成立,证明从i到k再到j的路径比i直接到j的路径短,我们便设置Dis(i,j) = Dis(i,k) + Dis(k,j),这样一来,当我们遍历完所有节点k,Dis(i,j)中记录的便是i到j的最短路径的距离。

3.矩阵计算方法-十字交叉法

1.计算各个节点之间的最短距离,约束图如下:
Floyd-Warshall[弗洛依德]算法

2.我们先将如图画成表格:
Floyd-Warshall[弗洛依德]算法

3.再将表格化成矩阵A,再创建一个二维数组Path,用于存放人意一对定点之间的最短路径Path

Floyd-Warshall[弗洛依德]算法

4.实现流程算法步骤

第一轮:


Floyd-Warshall[弗洛依德]算法

第一轮十字交叉法之后获得的A结果集:

0 1 2 3
0 0 5 7
1 0 4 2
2 3 3 0 2
3 1 0

第一轮十字交叉法之后获得的path结果集:

0 1 2 3
0 -1 -1 -1 -1
1 -1 -1 -1 -1
2 -1 -1 -1 -1
3 -1 -1 -1 -1

第二轮:


Floyd-Warshall[弗洛依德]算法

第二轮十字交叉法之后获得的A结果集:

0 1 2 3
0 0 5 9 7
1 0 4 2
2 3 3 0 2
3 1 0

第二轮十字交叉法之后获得的path结果集:

0 1 2 3
0 -1 -1 1 -1
1 -1 -1 -1 -1
2 -1 -1 -1 -1
3 -1 -1 -1 -1

第三轮:


Floyd-Warshall[弗洛依德]算法

第三轮十字交叉法之后获得的A结果集:

0 1 2 3
0 0 5 9 7
1 7 0 4 2
2 3 3 0 2
3 4 4 1 0

第三轮十字交叉法之后获得的path结果集:

0 1 2 3
0 -1 -1 1 -1
1 2 -1 -1 -1
2 -1 -1 -1 -1
3 2 2 -1 -1

第四轮:


Floyd-Warshall[弗洛依德]算法

第四轮十字交叉法之后获得的A结果集:

0 1 2 3
0 0 5 8 7
1 6 0 3 2
2 3 3 0 2
3 4 4 1 0

第四轮十字交叉法之后获得的path结果集:

0 1 2 3
0 -1 -1 3 -1
1 3 -1 3 -1
2 -1 -1 -1 -1
3 2 2 -1 -1

相关文章: