- 1、本文档共37页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
最短路算法及差分系统
Yuke Liao liao.yu.ke@ 2012/7/29
定义
在最短路问题中,给出的是一有向加权图G=(V,E), 在其上定义的加权函数W:E→R为从边到实型权值的映射。路径P=(v0, v1,……, vk)的权是指其组成边的所有权
值之和:
??
?? ?? = ??(???? ?1,????)
??=0
??定义u到v间最短路径的权为:
?
?
? ??? v)
? ?min?w( p):u?v?
如果存在由u到v的通路如果不存在
从结点u到结点v的最短路径定义为使权值最小
的任何路径。
负权边
对于存在负权边的图,定义需要做修正
2
-8 3
负权回路!!
若存在从起点可达的负权回路,则定义最短路为-∞
松弛技术
反复减小估计出的最短路权值的上限
设置d[v]来描述从源s到v的最短路径的权的上界, 称之为最短路径估计
INITIALIZE-SINGLE-SOURCE(G,s)
INITIALIZE-SINGLE-SOURCE(G,s)
For 每个结点 v V[G]
Do d[v] ←
[v] ← NIL 4. d[s] 0
RELAX(u,v,w)
If d[v] > d[u] + w(u,v)
Then d[v] ← d[u] + w(u,v) 3. [v] ← u
常用算法
Dijkstra algorithm
Bellman-Ford algorithm
SPFA algorithm
Dijkstra algorithm
Dijkstra(G,w,s)
INITIALIZE-SINGLE- SOURCE(G,S)
S
Q ← V[G]
While Q
Do u ← EXTRACT-MIN(Q)
S ← S U {u}
For 每个顶点v Adj[u]
Do RELAX(u,v,w)
Dijkstra Algorithm
? 算法的正确性(无负权边)
? 为什么对负权边失效
5
7 -5
适用条件:无负权边
堆优化的Dijkstra算法
Bellman-Ford Algorithm
Bellman-Ford(G,w,s)
1. INITIALIZE-SINGLE-SOURCE(G,s)
2. For i ← 1 to |V[G]|-1
3. Do For 每条边(u,v) E[G]
4. Do RELAX(u,v,w)
5. For 每条边(u,v) E[G]
6. Do If d[v] > d[u] + w(u, v)
7. Then Return FALSE
8. Return TRUE
Bellman-Ford Algorithm
5
MAX MAX
-2
6
-3
5
MAX
-2
6
-3
8 7
8
S 0
2
7
MAX
7
-4
MAX T
9
S 0
2
-4
7
MAX T
9
5
6 4
-2
6
-3
8 7
S 0
2 -4
7
7 2 T
9
5
2 4
-2
6
-3
8 7
S 0
2 -4
7
7 2 T
9
Bellman-Ford Algorithm
? 算法正确性(无负权值环)
两点间如果有最短路,那么每个结点最多经
过一次。也就是说,这条路不超过n-1条边
使用条件:可以有负权边。。。。
但算法效率较低
SPFA Algorithm
Shortest Path Faster Algorithm
没有被更新的点不用做松弛操作
队列辅助
SPFA Algorithm
SPFA(G,w,s)
1. INITIALIZE-SINGLE-SOURCE(G,s)
2. INITIALIZE-QUEUE(Q)
3. ENQUEUE(Q,s)
4. While Not EMPTY(Q)
5. Do u ← DLQUEUE(Q)
6. For 每条边(u,v) E[G]
7. Do tmp ← d[v]
8. Relax(u,v,w)
9. If (d[v] < tmp) and (v不在Q中)
10. ENQUEUE(Q,v)
SPFA Algorithm
? 算法正确性
? 期望时间复杂度为O(E)
Proof:
各算法之间的比较
算法
时间复杂度
空间复杂度
编程复杂度
适用范围
Dijkstra
O( V2 )或 O((E+V)logV)
O( V2 )或
O(E+V)
简单或相对复杂
不含负权的图
(窄)
Bellman-Ford
O(VE)
O(E+V)
简单
实数图(广)
SPFA
O(E)
O(E+V)
简单
实数图(广)
Example 1
若干个货币兑换点在城市中工作着,每个兑换点只能进行两种指定货币的兑换。不同兑换点兑换的货币有可能相同。每个兑换点有它自己的兑换汇率,货币A 到货币B的汇率表示要多少单位的货币B才
文档评论(0)