# Bellman-Ford算法证明
# 算法回顾
Bellman-Ford是寻找加权无向图(weighted undirected graph)中两个顶点之间最短路径的算法。用
bellman_ford(V, E, s)
// v.d表示从s到v的最短路径长度,初始化为Infinity
// v.p表示最短路径上该顶点的前一个顶点,即该顶点对应的parent(p)节点
for v in V:
v.d = Infinity
v.p = None
s.d = 0
// |V|表示所有顶点的数量
for i from 1 to |V| - 1:
// u和v对应一条有向边的起点和终点
for (u, v) in E:
relax(u, v)
// 执行完relax操作后,可以通过v.p回溯找到包含最短路径的所有边
其中用到的relax方法的伪代码定义如下:
relax(u, v):
// w(u,v)表示顶点u和v之间边的权值
if v.d > u.d + w(u,v):
v.d = u.d + w(u,v)
v.p = u
简单来说,Bellman-Ford算法就是对图中的所有边进行relax
操作,从而得顶点之间的最短路。该算法的好处在于,在执行完算法后,我们得到的不仅仅是relax
操作时,可以是任意遍历顺序。
# 算法证明
# 证明
这里我们假设图中没有negative cycle,主要关注怎么用数学归纳法(mathematical induction)来进行证明。
我们用
首先证明base case。当循环relax
操作的循环前,
然后假设循环relax
操作后满足
最后我们来分析循环
通过前面的假设,我们知道relax
操作具有单调递减的性质,即
所以当算法循环