【数据结构】图—弗洛伊德(Floyd)算法



前言

上文介绍了迪杰斯特拉(Dijkstra)算法,计算网图的某个源点到其余各个顶点的最短路径问题(边权值为非负值),本文介绍另一个求最短路径的算法——弗洛伊德算法,它是计算所有顶点到所有顶点的最短路径,其时间复杂度为 O ( n 3 ) O(n^3) O(n3),其算法相比Dijkstra算法更加简洁易懂。


算法思路

在迪杰斯特拉算法中,定义了两个一维数组int D[MAXVEX] int P[MAXVEX],D表示源点到其他顶点的最短路径和,P表示对应顶点的最小路径的前驱矩阵。

因为弗洛伊德算法中,以所有顶点为源点,因此应该定义为二维数组int D[MAXVEX][MAXVEX] int P[MAXVEX][MAXVEX],核心思路和迪杰斯特拉算法类似,从源点v到终点w,判断经过中转点k的路径是否比原来的路径更短。

例如下图中,A顶点B顶点在邻接矩阵中是10,如果经过C顶点中转,则路径和为 4 + 3 = 7 4+3 = 7 4+3=7,显然要比直接路径要短。

中转点

D [ v ] [ w ] = m i n { D [ v ] [ w ] , D [ v ] [ k ] + D [ k ] [ w ] } D[v][w] = min\{ D[v][w],\quad D[v][k] + D[k][w] \} D[v][w]=min{ D[v][w],D[v][k]+D[k][w]}

以某一顶点为中转点,遍历所有顶点为源点和终点,如果经过中转点更短,则将D中的相应位置更新。

以下面这个网图为例,观察一下具体是怎么计算的。

  • 2
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值