基于C#的Floyd最短路径算法

如果有这么一个问题,已知各顶点之间的距离,如下图:

基于C#的Floyd最短路径算法

我们需要求每对顶点之间的最短距离,可以使用Floyd算法

Floyd算法原理如下:

1,从任意一条单边路径开始。所有两点之间的距离是边的权,如果两点之间没有边相连,则权为无穷大。
2,对于每一对顶点 u 和 v,看看是否存在一个顶点 w 使得从 u 到 w 再到 v 比已知的路径更短。如果是更新它。

首先,把上图转为对应的数据结构。计算机存储图常用相邻矩阵和邻接表,这里使用相邻矩阵,转换而来的相邻矩阵是这样的:

基于C#的Floyd最短路径算法

其中,表中红色的5表示V0到V1的距离为5,而则表示a点无法直接到达b点。在C#中用二维数据表示:

基于C#的Floyd最短路径算法

其中INFINITE = 1.0 / 0.0;    得到的是无限大。

然后把G作为参数,传入Floyd算法:

基于C#的Floyd最短路径算法

其中,D就是存储不同顶点之间最短距离的数据。该算法第一次for循环中(即注释//initD代码上面的for循环),对D进行了初始化,得到的结果是这样的:

基于C#的Floyd最短路径算法



在下面的循环中,如果顶点i到顶点j的距离经过顶点v后距离变短,则更新最短距离。

第一次循环之后的D(顶点i与顶点j经过点V0后的距离是否变短):

基于C#的Floyd最短路径算法

D没有改变,因为没有两个点经过V0后距离变短。

第二次循环之后的D(顶点i与顶点j经过点V1后的距离是否变短):

基于C#的Floyd最短路径算法

第三次循环后的D(顶点i与顶点j经过点V2后的距离是否变短):

基于C#的Floyd最短路径算法

第四次循环后的D(顶点i与顶点j经过点V3后的距离是否变短):

基于C#的Floyd最短路径算法

到此算法结束,得到了最终的结果,用该结果与下图对照

基于C#的Floyd最短路径算法

完全正确。