改变距离定义情况下Dijkstra算法正确性成立的一个充分条件

变式的Dijkstra算法

假设存在G=(V,E),源顶点为v,U={v},min[i]记录v到i的距离,dis[i][j]为ij路径权值
1.从V-U中选择使min[i]值最小的顶点i,将i加入到U中(贪心)
2.松弛,即更新与i直接相邻顶点的min[i]值,min[j]=min{min[j],L(min[i],dis[i][j]}))(动态规划)
3.直到U=V

其中,L(x)表示一条弧的长度
修改距离的定义,ab+bc这条由ab和bc组成的弧的长度不一定满足L(ab+bc)=L(ab)+L(bc)了
而用L(x+y)表示弧的合成函数,显然,ab+bc这条路径中仍然满足L(ab+bc)=L(L(ab),L(bc))

如果把Floyd看作一个动态规划算法,而贪心是动态规划的特例,Dijkstra算法就是一个类似Floyd算法的最短路算法,只是用于求解单源最短路。

那么,既然修改了距离的定义,怎样的L(x+y)函数令变式Dijkstra算法正确性成立呢?

变式Dijkstra算法成立与不成立的几个例子

1.变式Dijkstra在L(x+y)=L(x)+L(y)且非负权值情况下成立
2.变式Dijkstra在L(x+y)=L(x)+L(y)且存在负权值情况下不成立
3.变式Dijkstra在L(x+y)=L(x)*L(y)且权值大于等于1情况下成立,事实上,3.在取对数后与1同构,容易理解这一点

1.2.3本质上都是围绕L(x+y)=L(x)+L(y)情况及其同构情况,有传统Dijkstra作为经验,都是平凡的,下面举一个不平凡的例子:

4.变式Dijkstra在L(x+y)=max{L(x),L(y)}情况下成立
这个例子来自题目poj 2253 Frogger,阅读这个例子发现,这个L(x+y)的定义很有现实意义,这个L(x)可以表示经过弧x需要的最小能力,而能力不会随着走路而衰弱。当时并没有深究成立的原因。

变式的Dijkstra算法成立的一个充分条件以及证明

L(x+y) max{L(x),L(y)}

用这个结论来审查上面情况1.2.3.4,一目了然,所以很可能这个结论比较本质,下面证明可以看出似乎如此。

证明:
如果某些点的min求错了,找出其中最先被放入U的那一个点x,那么考虑x被放入U的情况。
如果不存在事实上的最短路经过V-U,那么错误不会发生,因为U里的点min都是正确的,而以U里的点位中转到达x的路径之前已经松弛过了。
所以必然存在y∈V-U,存在最短路vyx=vy+yx必有min[x]>L(vy+yx) max{L(vy),L(yx)} L(vy) min[y]
这就引发了矛盾,由贪心法,这一步应该放入y而非x
证毕

结语

虽然这个结论之前没见过,但是在对算法比较了解的人眼里,这个结论肯定不是什么很生僻冷门的结论,不然也不会出出来poj 2253 Frogger这个题,而且这个结论证明也比较简单。
证明符号不是很规范,但是不影响阅读。
如果大家有什么更好的充分条件,甚至有充分必要条件,还请留言告诉作者,谢谢!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值