最短路径 Part I- Single source shortest path

单源最短路径问题: 即从一个起点 (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 i1 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)


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值