第K短路

首先证明那个比较显然的推论

我们先证明一下一个小引理:搜索树边权(也是后继的代价减去前驱的代价)非负的优先队列BFS先出队的点一定比后出队的点的代价小或等于

用数学归纳法,假设前面已经出队的点满足以上性质,之前最后一个出队的点为x,现在队列里面的队首是y,那我们就是要证明x的代价比y小或等于

我们考虑一下y是怎么来的

如果y是由x扩展来的,那么由于搜索树边权非负,所以结论得证

如果y不是由x扩展而来的,那么之所以yx后出队,就是因为y的代价大于等于x,所以结论也得证

然后我们考虑反证,假设x这个点已经第i次被取出了,由以上推论那么这一条路径显然至少是第i短路

如果这条路径不是第i短路,那么我直接让这个队列扩展无穷次,第i短路一定会出现,而且出现在这一条路径的后面

与推论矛盾,所以蓝书推论得证

然后我们考虑用A*优化这一个优先队列BFS,估价函数就像蓝书这么设计

很巧的一件事情是,这么设计后,不会出现上一篇博客说的那种特殊情况,就是仍然满足P126说的这个推论

我们考虑一下什么BFS才满足我们上面证明的引理:搜索树上的边权非负且是优先队列BFS

这里的A*是基于优先队列的,没问题

那么这个A*的搜索树边权非负吗?是的,下面是证明

考虑搜索树上的一个点x,在有向图中有一条边(x,y,w),其中w是题目给的有向图的边权

由最短路定义可得fxfy+w

所以dist+fxdist+w+fy

而上式前者是x的代价,后者是y的代价

所以搜索树上的边权(即y的代价减去x的代价)非负,也满足这个引理

但是注意,我们的引理说的“代价”二字指的是节点的状态代价,在这里的A*中,是第i短路的长度加上最短路长度,所以我们还有下述论证

对同一个点取出了i次,那么第i次一定是第i短路,因为对于同一个点估价函数是相同的,不同的状态代价减去相同的估价函数,也就是第i短路

posted @   最爱丁珰  阅读(6)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
点击右上角即可分享
微信分享提示