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.计算各个节点之间的最短距离,约束图如下:
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wDXZTab1-1603514062107)(evernotecid://06AB9D19-4A7C-4B66-B580-5E2D6C5A08F1/appyinxiangcom/27093205/ENResource/p50)]](/https://i-blog.csdnimg.cn/blog_migrate/6c4946450af99e895b8591d8f1b32dca.png#pic_center)
2.我们先将如图画成表格:
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-u32IXCmF-1603514062110)(evernotecid://06AB9D19-4A7C-4B66-B580-5E2D6C5A08F1/appyinxiangcom/27093205/ENResource/p51)]](/https://i-blog.csdnimg.cn/blog_migrate/279641b9af8b6f83fe4e1820752ac40f.png#pic_center)
3.再将表格化成矩阵A,再创建一个二维数组Path,用于存放人意一对定点之间的最短路径Path
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ERYFwDgx-1603514062112)(evernotecid://06AB9D19-4A7C-4B66-B580-5E2D6C5A08F1/appyinxiangcom/27093205/ENResource/p52)]](/https://i-blog.csdnimg.cn/blog_migrate/75e82feb3c926f11ad285c8dea1faab0.png#pic_center)
4.实现流程算法步骤
第一轮:
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-eBjDgRHS-1603514062116)(evernotecid://06AB9D19-4A7C-4B66-B580-5E2D6C5A08F1/appyinxiangcom/27093205/ENResource/p55)]](/https://i-blog.csdnimg.cn/blog_migrate/1814d4c20408ed2424f2a5736f6c8673.png#pic_center)
第一轮十字交叉法之后获得的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 |
第二轮:
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dkvWQt5S-1603514062117)(evernotecid://06AB9D19-4A7C-4B66-B580-5E2D6C5A08F1/appyinxiangcom/27093205/ENResource/p54)]](/https://i-blog.csdnimg.cn/blog_migrate/c1bba9474c73274313c1e302af63a7b6.png#pic_center)
第二轮十字交叉法之后获得的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 |
第三轮:
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-F5erjJ2c-1603514062118)(evernotecid://06AB9D19-4A7C-4B66-B580-5E2D6C5A08F1/appyinxiangcom/27093205/ENResource/p57)]](/https://i-blog.csdnimg.cn/blog_migrate/bf3e59148a4550e847e60a8d3f71af11.png#pic_center)
第三轮十字交叉法之后获得的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 |
第四轮:
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-EiMHLPnW-1603514062118)(evernotecid://06AB9D19-4A7C-4B66-B580-5E2D6C5A08F1/appyinxiangcom/27093205/ENResource/p58)]](/https://i-blog.csdnimg.cn/blog_migrate/7ee55562dd20bd080f96d848057a398e.png#pic_center)
第四轮十字交叉法之后获得的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 |
Floyd-Warshall算法是一种解决任意两点间最短路径的动态规划算法,尤其适用于有向图或负权边的情况。它通过动态更新节点间的最短路径,在O(N^3)的时间复杂度内完成计算。算法原理包括对每个节点k检查是否存在更短路径,通过十字交叉法进行矩阵计算,逐步找到最短路径。

1954

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



