单源最短路径 中的一些概念和结论

作者目前更改的写博客的思路,现在是每写完一个小节便将它上传,不再一直憋着,试图把该章写完了。

 

最短路径问题中,给定一个带权重的有向图G = (V, E),和权重函数w: E ->R,图中一条路径p = <v0, v1, ……, vk>的权重 w(p)是构成该路径的所有边的权重之和:

w(p) = \sum_{i = 1}^{k}w(v_{i - 1}, v_{i}),并定义最短路径权重:

δ(u, v) = min{w(p):u到v的路径},若存在该路径,否则将置为∞。

在本章将讨论单源最短路径问题:给定一个图G=(V, E),我们希望找到从给定源节点s∈V到每个结点v∈V的最短路径。

       (最短路径的最优子结构)引理1:对有向图G = (V,E),和权重函数w:E→R,设p = <V0, V1, ……, Vk>是从结点V0到Vk的一条最短路径,并且对于任意 i 和 j,0 ≤ i ≤ j ≤ k,设 Pij = <Vi, Vi+1……, Vj>为路径p中从结点Vi到结点Vj的一条子路径,那么Pij是从vi到vj的一条最短路径。

证明十分简单,即将整个路径拆分为从V0到Vi,从Vi到Vj以及从Vj到Vk的路径,倘若Vi到Vj并非最短路径,那么我们就可以找到一条最短路径来代替它,从而使路径p更短。

负权重的边:

单源最短路径问题支持存在负权重的边,不过我们不希望图中存在权重为负的环路。倘若这样的话,我们可以一直绕着环路转,从而使得经过包含这条环路的路径的权值一直减小。因此,若从s到v的某条路径存在权值为负值的边,那么我们有定义:δ(s, v) = - ∞

环路:

正如上述,在最短路径中不能包含权重为负的环路;同时,简单的,我们也不会包括一个权重为正的环路,而对于权重为0的环路,我们做的也是不包含在内,因为这样的环路不包含也罢。这样就能保证最短路径中得到的是简单路径。

那么,根据上述,我们对于图G = (V, E),一条简单路径最多包含|V|个结点,同时因为它是无环的,因此每个结点最多经过一次,因此所经过的边的数目最多为|V| - 1。

最短路径的表示:

对于图G = ( V,E)中的每个结点V,我们维持一个前驱节点v.p,该前驱结点可能是另一个结点,或者是NIL。这样,对于某个结点v,我们反向递归打印其v.p,则能得到一条最短路径(类似于拓扑排序中对结点的操作)。

然而,在运行算法时,我们并不保证通过p就能得到一条最短路径——因为我们可能还会对它进行一些修改,在最后其不变的时候才能做出保证。

之后介绍前驱子图(尽管我们在BFS以及MST中已经提及过多次,不过此处的有所不同):Gp = (Vp, Ep),其中,Vp为图G中的前驱结点不为NIL的结点的集合,加上源节点s, Vp = {v∈V:v. p != NIL}∪{s},

Ep为:

Ep = {(v.p, v)∈E,v∈Vp - {s}}.

这里,可能会有人会好奇:除了源节点还有什么结点的p属性是为NIL的?答案是那些源节点到达不了的结点,他们处于视界之外(这里是笔者补充)。

在算法终止时,Gp是一棵最短路径树,它包含从源节点s到达每个可以从s到达的结点的一条最短路径。

 

松弛技术(relaxation)

本章的算法需用用到该技术,可能名字听起来高大上,实际上十分简单。

对于每个结点,我们维持一个属性v.d,记录从源节点s到结点v的最短路径权重的上界,被称作:最短路径估计,之后将给出详细的用法。在此之前,我们先初始化:

Initialize_Single_Source(G, s)
for each vertex v ∈ G.V
         v.d = ∞
         v.p = NIL
s.d = 0

之后是松弛操作:

Relax(u, v, w)
if v.d > u.d + w(u, v)
   v.d = u.d + w(u, v)
   v.p = u

该操作的文字表述就是:对于边(u, v)进行的松弛操作,如果我之前预估得到的从源节点s到v的最短路径比源节点s到u的最短路径,加上(u, v)的权重大,那么我就调整:我将估计后者将会是我的最短路径,(尽管此时可能我们还不确定u.d是不是从s到u的最短路径,不过好歹比我原来的路径短),并且将u置为v的p.

 

最短路径和松弛操作的性质

以下给出一些相关的性质,它们将在后续得到证明,现在先做介绍,因为我们要用到它们。

1、三角不等式性质:对任意边(u, v)∈E,我们有δ(s, v) ≤ δ(s, u) + w(u, v)。

这个很形象,是上面最优子结构的引理,可以轻易得到证明。

2、上界性质:对v∈V,我们总有v.d ≥ δ(s, v),若 v.d 的取值达到δ(s, v),其值将不会发生变化。

这个也很显然,是上面松弛操作得来的结论。

3、非路径性质:如果从s到v不存在路径,则v.d = δ(s, v) = ∞。

这个同样很显然,因为不存在路径,那么我们就无从松弛相应的边的长度。

4、收敛性质:对某些结点s, v∈V,若从s->u→v是一条最短路径(注意,此处s->指的并不只是一条边,它也可以代表从s到u的的一条路径),在(u, v)松弛前的任意时间若 u.d = δ(s, u),则在对(u, v)松弛后,v.d = δ(s, v)。

这个也易于证明,只需要根据上述的最优子结构得证便可:u.d = δ(s, u)后,那么它将不会发生改变,同时因为从s到v的简单路径经过u,因此对边(u, v)松弛后,再对其他到达v的边(我们称之为边(t, v))进行松弛则代表我们会将t.d + w(t, v)和 u.d + w(u, v)进行比较,显然,后者将是更小的——因为它是最短路径的权重。

5、路径松弛性质:若p = <V0, V1,……, Vk>是从源节点s = V0 到结点Vk的一条最短路径,且对p中边松弛的顺序是(V0, V1), (V1, V2), (V2, V3)……(Vk-1, Vk),则Vk.d = δ(s, Vk)。该性质的成立与其他的松弛操作无关,即使这些松弛操作是与对p上进行的松弛操作穿插进行。

这个结论看上去十分困难,不是实际上并不难,我管理解它的方式为各扫门前雪,因为其他的松弛操作影响不到这个路径上的最短距离估计的大小:由于我们是按路径顺序进行松弛操作,因此在对路径上的边(u, v)进行操作前,u.d的大小在前一次路径上的松弛操作中的已经确定——我们将再也无法更改它的大小。因此,在这两次路径上的松弛操作中,其他的松弛操作将不会影响u.d的值,因此我们就可以放心的修改在对(u, v)的松弛操作中顺利的修改v.d的值了。

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值