Floyd算法
Floyd算法
Floyd算法介绍
- 和Dijkstra算法一样,弗洛伊德(Floyd)算法也是一种用于寻找给定的加权图中顶点间最短路径的算法。该算法名称以创始人之一、1978年图灵奖获得者、斯坦福大学计算机科学系教授罗伯特·弗洛伊德命名
- 弗洛伊德算法(Floyd)计算图中各个顶点之间的最短路径
- 迪杰斯特拉算法用于计算图中某一个顶点到其他顶点的最短路径
- 弗洛伊德算法 VS 迪杰斯特拉算法:迪杰斯特拉算法通过选定的被访问顶点,求出从出发访问顶点到其他顶点的最短路径;弗洛伊德算法中每一个顶点都是出发访问点,所以需要将每一个顶点看做被访问顶点,求出从每一个顶点到其他顶点的最短路径。
弗洛伊德算法思路:
- 假设图中有顶点 $ v_i $、$ v_j$ 和 $ v_k $,其中 $ L_{ik} $表示从顶点 $v_i $到顶点 $ v_k $ 的最短路径,$ L_{kj} $ 表示从顶点 $ v_k $ 到顶点 $ v_j $ 的最短路径。那么,顶点 $ v_i $ 到顶点 $ v_j $ 的最短路径 $ L_{ij} $ 可以通过以下方式计算:
$$
L_{ij} = \min(L_{ij}, L_{ik} + L_{kj})
$$
也就是说,从 $ v_i $ 到 $ v_j $ 的最短路径,可能是直接从 $ v_i $ 到 $ v_j $ 的路径(即 $ L_{ij} $),或者是通过一个中间顶点 $ v_k $ 经过 $ v_k $ 的路径,即先从 $ v_i $ 到 $ v_k $,再从 $ v_k $ 到 $ v_j $。
-
在实际算法中,针对每一对顶点 $ (v_i, v_j) $,我们都会依次考虑所有可能的中间顶点 $ v_k $(即图中的每个顶点),计算并更新从 $ v_i $ 到 $ v_j $ 的最短路径。具体来说,对于每一个中间顶点 $ v_k $,我们更新所有顶点对 $ (v_i, v_j) $ 的最短路径:
$$
L_{ij} = \min(L_{ij}, L_{ik} + L_{kj})
$$ -
最终,当所有的顶点都作为中间点被考虑过之后,我们就能够得到每一对顶点之间的最短路径。
图解:
求每A-G点到其余各点的最短路径/距离?
-
在算法进行过程中,重点维护两张表:距离表、前驱表,初始化如下:
-
仅以第一次为例,将A作为中间节点,对两张表进行更新:其中,只更新了B-A-G[23](经过中间顶点A),故更新B-G为23,标黄的B-F[7]比B-A-F[24]小,所以不更新B-F。
-
真–人工手动跑一遍结果(代码验证无误)
代码实现
FloydAlgorithm
1 | package com.yukinoshita.algorithm.floyd; |




