屈婉玲《算法设计与分析》第2版第7章网络流算法学习笔记。
概述
Dijkstra算法是经典的求单源最短路径算法,当有以下需求时:
- 要求出任意两点间的最短路径;
- 可能有负权边;
用Floyd算法,可以在不存在负回路时,求得任意两点间最短路径;存在负回路时,检测出一条负回路。
算法思想
使用动态规划法,记从i到j经过号码不大于k的最短路径为d(k)(i, j),那么从i到j的路径分为两种:
- 不经过k的,那么和k-1时一样, d(k)(i, j) = d(k-1)(i, j);
- 经过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) &#