Floyd算法求解各顶点之间最短路径问题

Floyd算法求解各顶点之间最短路径问题

      • 一、Floyd算法

一、Floyd算法

  • 概述

Floyd算法,也称为Floyd-Warshall算法,是一种用于求解图中所有节点之间最短路径的算法。Floyd算法可以处理负权边的情况,但是不能处理负权环。
Floyd算法基于动态规划思想,通过一个二维数组记录从一个节点到另一个节点的最短路径长度。算法的核心思想是逐渐增加中间节点,如果在加入一个中间节点后能够获得更短的路径,则更新路径长度。经过n次迭代之后,最终可以得到图中任意两个节点之间的最短路径长度。

  • 示例
  1. 初始状态

初态

如图:这是一个有三个顶点的有向图,矩阵A存储了两点之间的最短距离,在初始状态下就是一个邻接矩阵;矩阵pre记录了两点之间的最短路径中,加入的中转顶点。

  1. v 0 v_0 v0为中转点
初始状态路径长度加入中转点 v 0 v_0 v0路径长度是否加入
v 1 v_1 v1 -> v 1 v_1 v10 v 1 v_1 v1 -> v 0 v_0 v0 -> v 1 v_1 v110 + 6 = 16×
v 1 v_1 v1 -> v 2 v_2 v24 v 1 v_1 v1 -> v 0 v_0 v0 -> v 2 v_2 v210 + 13 = 23×
v 2 v_2 v2 -> v 1 v_1 v1 ∞ \infty v 2 v_2 v2 -> v 0 v_0 v0 -> v 1 v_1 v15 + 6 =11
v 2 v_2 v2 -> v 2 v_2 v20 v 2 v_2 v2 -> v 0 v_0 v0 -> v 2 v_2 v25 + 13 = 18×

所以,在 v 2 v_2 v2 -> v 1 v_1 v1之间加入点 v 0 v_0 v0作为中转。这里没有考虑在 v 0 v_0 v0 -> v 0 v_0 v0 v 0 v_0 v0 -> v 1 v_1 v1 v 0 v_0 v0 -> v 2 v_2 v2 v 1 v_1 v1 -> v 0 v_0 v0 v 2 v_2 v2 -> v 0 v_0 v0中加入 v 0 v_0 v0作为中转,因为这没有意义;我们将计算得出的结果反映在下图中,将 A ( 1 ) A^{(1)} A(1)[ v 2 v_2 v2][ v 1 v_1 v1]的值置为11,表示在加入 v 0 v_0 v0作为中转之后,最短路径的长度由 ∞ \infty 变为了11, A ( 1 ) A^{(1)} A(1)[ v 2 v_2 v2][ v 1 v_1 v1]的值置为0,表示 v 2 v_2 v2 v 1 v_1 v1这个路径路径中,加入了 v 0 v_0 v0作为中转点。

请添加图片描述

  1. v 1 v_1 v1为中转点
初始状态路径长度加入中转点 v 0 v_0 v0路径长度是否加入
v 0 v_0 v0 -> v 0 v_0 v00 v 0 v_0 v0 -> v 1 v_1 v1 -> v 0 v_0 v06 + 10 = 16×
v 0 v_0 v0 -> v 2 v_2 v213 v 0 v_0 v0 -> v 1 v_1 v1 -> v 2 v_2 v26 + 4 = 10
v 2 v_2 v2 -> v 0 v_0 v05 v 2 v_2 v2 -> v 1 v_1 v1 -> v 0 v_0 v011 + 10 = 21×
v 2 v_2 v2 -> v 2 v_2 v20 v 2 v_2 v2 -> v 1 v_1 v1 -> v 2 v_2 v211 + 4 = 5×

分析过程同上,结果如下图

请添加图片描述

  1. v 2 v_2 v2为中转点
初始状态路径长度加入中转点 v 0 v_0 v0路径长度是否加入
v 0 v_0 v0 -> v 0 v_0 v00 v 0 v_0 v0 -> v 2 v_2 v2 -> v 0 v_0 v010 + 5 = 156×
v 0 v_0 v0 -> v 1 v_1 v16 v 0 v_0 v0 -> v 2 v_2 v2 -> v 1 v_1 v16 + 10 = 16×
v 1 v_1 v1 -> v 0 v_0 v010 v 1 v_1 v1 -> v 2 v_2 v2 -> v 0 v_0 v04 + 5 = 9
v 1 v_1 v1 -> v 2 v_2 v20 v 1 v_1 v1 -> v 2 v_2 v2 -> v 1 v_1 v14 + 11 = 15×

分析过程同上,结果如下图

请添加图片描述

  1. 如何使用这两个矩阵呢?

例如,通过A,我知道 v 0 v_0 v0 v 2 v_2 v2的最短路径长度是10,从pre可以知道,从 v 0 v_0 v0 v 2 v_2 v2需要先从 v 0 v_0 v0 v 1 v_1 v1,再从 v 1 v_1 v1 v 2 v_2 v2

6.时间复杂度和空间复杂度

时间复杂度解释空间复杂度解释
O( ∥ V ∥ 3 \|V\|^3 V3)Floyd算法的执行过程是每次将一个顶点作为中转,|V|个顶点,需要执行|V|次相同的操作,在每次操作中,我们都需要遍历矩阵A,需要 ∥ V ∥ 2 \|V\|^2 V2的时间,所以总共需要O( ∥ V ∥ 3 \|V\|^3 V3)O( ∥ V ∥ 2 \|V\|^2 V2)在算法执行的过程中,需要借助两个数组,A和pre,两个数组都需要 ∥ V ∥ 2 \|V\|^2 V2的空间,所以空间复杂度是O( ∥ V ∥ 2 \|V\|^2 V2)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值