单源最短路径问题: 即从一个起点 (single source)到其他节点的最短路径。
Lemma 1. 最短路径的子路径也是最短路径。 (如果子路径不是最短路径那么之前的路径也不是最短路径)。
Negative weight edges
If the graph G = (V, E) contains no negative weight cycles reachable from the source s, then for all v belong to V, the shortest path weight deta(s, v) remains well defined, even if it has a negative value.
意思是 从s点 到v 点, 如果在图中没有负权重的环,则权重存在,即使有负权重。
负权重的环 意思是一个环它的权重和是负的,如果两点之间路径上没有这样的负权重环则路径存在。
Dijkstra 算法要求图中weight非负。 Bellman-Ford 算法允许有负权重,只要没有负权重环,如果存在这样的环bellman-ford 可以检测出来,并报告出来。
Cycles: 最小路径上不能有环,(否则去掉这个环路径会更小)
Bellman-Ford Algorithm
适用于单源最短路径,可以判断是否有负权回路(若有,最短路径不存在)。
Inilization Alogrithm-初始化 O(V)
INITIALIZE-SINGLE-SOURCE(G, s)
1. for each vertex
v ∈ V[G]
2.
do d[v] = INFINIT_MAX
3.
pi[v] = NIL
4. d[s] = 0
松弛技术
RELAX(u, v, w)
// w 表示u 到v的距离
1. if d[v] > d[u] + w(u, v)
// 一定注意顺序 d[v] > d[u] + w
2.
then d[v] = d[u] + w(u,v)
3.
pi[v] = u
Bellman-FORD 算法如下
BELLMAN-FORD(G, w, s) 1 INITIALIZE-SINGLE-SOURCE(G, s) 2 for i ← 1 to |V[G]| - 1 3 do for each edge (u, v) ∈ E[G] 4 do RELAX(u, v, w) 5 for each edge (u, v) ∈ E[G] 6 do if d[v] > d[u] + w(u, v) 7 then return FALSE 8 return TRUE其中注意:
1. line 2 中i只是用来控制循环次数;
2. 对所有边进行遍历,边的顺序对更新过程有影响,但是对结果没有影响。
3. 如果返回值为False 表示包含负权回路; 否则true
算法的复杂度:
1. 算法初始化的复杂度是O(V)
2. 算法line2~4 的复杂度是O((|V|-1)*E)
3. 算法line5~7 的复杂度是O(E)
总的复杂度是O(VE)