Bellman-ford algorithm:
算法过程:首先初始化,对所有的节点V来说,所有的边E进行松弛操作,再然后循环遍历每条边,如果d[v] > d[u] + w(u,v),表示有一个负权重的环路存在。
最后如果没有负权重环路,那么d[v] 是最小路径值。
证明:使v ∈ V是任意的节点,考虑这个路径p =< v0, v1, . . . , vk>, v0 = s, vk = v,这是一条最短的路径,没有负权重环路。
考虑下图
最开始d[v0] = 0 = δ(s, v0),没有变化,在一次经过E之后,因为我们要对(v0, v1)进行松弛操作,找不到比这个还短的路径。
第二次经过之后,我们有d[v2] =δ(s, v2),因为我们第二次经过是要松弛(v1, v2)的
第i次之后我们有d[vi ] = δ(s, vi),经过k次之后k <= |V| - 1,我们有d[vk] = d[v] = δ(s, v).
python代码:
def bellman_ford(graph, source):
dist = {}
p = {}
ma