多源最短路径Floyd算法(可用于找负回路) C++实现

本文介绍了Floyd算法用于求解多源最短路径并检测负回路的问题,通过C++代码实现。算法基于动态规划,通过迭代更新最短路径。在过程中,如果发现d(k)(i, i) < 0,则表示存在负回路。文章通过实例详细展示了算法过程,并给出了从源点到终点的最短路径及路径顶点回溯方法。" 54890796,5707825,Java请求数据本地缓存优化,"['Java开发', '缓存技术', '性能调优', '数据存储']
摘要由CSDN通过智能技术生成

屈婉玲《算法设计与分析》第2版第7章网络流算法学习笔记。

概述

Dijkstra算法是经典的求单源最短路径算法,当有以下需求时:

  1. 要求出任意两点间的最短路径;
  2. 可能有负权边;

用Floyd算法,可以在不存在负回路时,求得任意两点间最短路径;存在负回路时,检测出一条负回路。

算法思想

使用动态规划法,记从i到j经过号码不大于k的最短路径为d(k)(i, j),那么从i到j的路径分为两种:

  1. 不经过k的,那么和k-1时一样, d(k)(i, j) = d(k-1)(i, j);
  2. 经过k的,则d(k)(i, j) = d(k-1)(i, k) + d(k-1)(k, j)

即判断以k为中间点的话会不会更近。

可得递推方程:

d(0)(i, j) = w(i, j)
d(k)(i, j) = min{
    d(k-1)(i, j), d(k-1)(i, k) + d(k-1)(k, j) }, i,j≠k

为了记录具体路径,引入h(k)(i, j)记录最短路径中i的下一跳,有以下递推关系(标号从1开始):

h(0)(i, j) = j, 若<i, j>∈E,
h(0)(i, j) = 0, 若<i, j>∉E,

h(k)(i, j) = h(k-1)(i, j),若不用经过k
h(k)(i, j) = h(k-1)(i, k),若需要经过k,且i,j≠k

例子

在这里插入图片描述
d(0)和h(0):
在这里插入图片描述
d(1)和h(1):
在这里插入图片描述
变化的值:

d(1)(3, 2) = d(0)(3, 1) + d(0)(1, 2) = 2 - 1 = 1
d(1)(4, 2) = d(0)(4, 1) + d(0)(1, 2) &#
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值