最短路径-bellman-ford算法

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
• 表达为Ax ≤b.
1 0 -1 x1 0 0 1 -1 x2 ≤ 1 -1 1 0 x3 -2
x1-x3≤0 x2-x3≤1 x2-x1≤-2
三角形不等式 d[v]<=d[u]+w(u,v)
可得
d[v]-d[u]<=w(u,v)….
x1-x3≤0 x2-x3≤1 x2-x1≤-2
d[1]-d[3]≤0 d[2]-d[3]≤1 d[2]-d[1]≤-2
Bellman-Ford算法
d[v]:从源点s到v的距离
最短路径松弛操作: RELAX(u,v,w)
if d[v] < d[u] + w[u,v] d[v] = d[u] + w[u,v]
若干次操作过后d[v]不会再改变,此时d[v] 源点s到v的最短路径权值和 约定: +∞ +w(u,v)= +∞.

2
4 2
7
6
0 10
1 7
检查负权回路: 负权回路可以无限松弛
-1 -1
-1
-1 0
-1 ∞
-1 0
-1 -1 -1
-1 -1
-1
-1 -1
-1
-1 -1
-2
-1 -1
-1
………………… ………………… ………………..
• POJ 3259 • 农夫john有许多农场 • 每个农场有许多田以及虫洞 • 从一块田到另一块田要T分钟,双向 • 通过虫洞可以使时光倒流T分钟,单向 • John想在出发时间之前回到起点……. • 可以从任意点出发.
• 思路:枚举所有顶点作为源点的情 况,Bellman-Ford判断是否存在负环
• 注:不枚举也可以过,测试数据中的图都 是连通图…….
• 构图: 消耗时间则边为权+T,时光倒流则边 权为–T
差分约束系统与最短路径
• 线性规划矩阵A中的每一行包含一个1和一 个-1,其他元素为0. (来自《算法导论》)
算法流程(来自《算法导论》)
BELLMAN_FORD(G,w,s)
1INITALIZE-SINGLE-SOURCE(G,s)
2for i <- 1 to | V[G] | -1
3 do for each edge(u,v) ∈E[G]
4
do RELAX(u,v,w)
5for each edge(u,v) ∈E[G]
多谢捧场
最短路径构造差分约束系统的一个解 上例的解为X=(d[1],d[2],d[3])
• 对于一个常数c,若X=(d[1],d[2],d[3])是差分 约束系统一个解,X=(d[1]+c,d[2]+c,d[3]+c) 也是一个解
• 构造一个新的顶点v0,且该顶点到其他任意 顶点距离为常数c….
POJ 1716
6 do if d[v]>d[u]+w(u,v)
7
then return false
8return true
第一行初始化. 第二行循环 |V[G] |-1次,即图G中点的个数-1次 第三,四行执行松弛操作 第五~八行判断是否有负权回路
来自百度文库 2
7 10
1
∞ ∞
0

2
2
4
7
6
0 10
7
2
2 10
1 10
f(b+1)-f(a)<=2 f(x)-f(x+1)<=0 f(x+1)-f(x)<=1 松弛最短路
f(a)- f(b+1)>=-2 f(x+1)-f(x) >=0 f(x)-f(x+1) >=-1 松弛最长路
注意不等号方向!
处理相等约束
xi-xj=c xi-xj<=c xi-xj<=c xi-xj>=c xj-xi<=-c
• 给定闭区间[a,b],至少选择两个在区间内的 整数
• 有若干个区间 • 为了满足上述要求,最少要多少个整数.
• 建立差分约束系统求解
• 设f(x)为[0,x)之间符合要求的整数个数,则可 得f(b+1)-f(a)<=2
• 由f(x)的意义0<=f(x+1)-f(x)&&f(x+1)-f(x)<=1, 即在区间[x,x+1)中至多选取一个数
相关文档
最新文档