首页 > 其他分享 >对第K短路一题的一些解释

对第K短路一题的一些解释

时间:2023-11-23 16:57:39浏览次数:34  
标签:推论 解释 非负 短路 BFS 出队 一题 边权

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

我们先证明一下一个小引理:这个BFS先出队的点一定比后出队的点的代价小或等于

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

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

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

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

由以上证明不难得出,其实优先队列的BFS都满足这个引理

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

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

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

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

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

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

那么这个A*的边权非负吗?是的

考虑搜索树上的一个点\(x\),有一条边\((x,y,w)\),其中\(w\)是边权

由最短路定义可得\(f_{x}≤f_{y}+w\)

所以\(dist+f_{x}≤dist+w+f_{y}\)

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

所以边权非负,也满足这个引理

然后对同一个点取出了\(i\)次,那么第\(i\)次一定是第\(i\)短路,因为对于同一个点估价函数是相同的,不同的实际代价,也就是第\(i\)短路

标签:推论,解释,非负,短路,BFS,出队,一题,边权
From: https://www.cnblogs.com/dingxingdi/p/17851940.html

相关文章

  • 重要的保护:BOSHIDA DC电源模块短路保护
    重要的保护:BOSHIDADC电源模块短路保护DC电源模块是实验室和工业中非常常见的电源,它能够提供稳定的电压和电流输出,以满足各种设备和电路的需求。然而,如果DC电源模块没有短路保护,它可能会对所连接的仪器和设备造成损害,甚至引起火灾等严重后果。因此,在设计和制造DC电源模块时,短路保......
  • Ego_planner_swarm之minimum snap(jerk)代码解释
    首先是minimumsnap的理论推导过程https://blog.csdn.net/u011341856/article/details/121861930我对他的博客的一些笔记https://pan.quark.cn/s/8549109ff930#/list/share下面就是对高飞老师egoplanner中的minimumsnap(jerk)的注释解析#include<iostream>#include<traj......
  • Python全局解释器锁GIL机制
    全局解释器锁GlobalInterpreterLock,CPython在解释器级别的一把锁,叫GIL全局解释器锁。程序编译成字节码,程序想跑多线程,但是GIL保证CPython进程中,同一时刻只能有一个线程执行字节码。所以,哪怕是在多CPU的情况下,即使每个线程恰好调度到了每个CPU上,有了这把大锁,同时只能有一个CPU......
  • dijkstra跑全源最短路
     跑n次voiddijk(){ for(inti=1;i<=n;i++) for(intj=1;j<=n;j++)d[i][j]=inf; priority_queue<pii,vector<pii>,greater<pii>>q; for(intS=1;S<=n;S++){ q.push(pii(0,S)); for(inti=1;i<=n;i++)......
  • redis中查看慢日志以及返回参数值的解释
    1、问题描述 业务反馈,出现很多连接redis的readtimedout的报错  2、问题分析及解决 由于redis是单线程处理的,所有redis接收到命令,都会进入到队列中,等待执行。 当客户端,由于等待时间过长,没有接收到server端返回的数据,就是出现超时的报错。 程序里,jedis客户端,默......
  • Vscode怎么指定Python解释器
    Windows使用Vscode编写Python代码默认使用系统手动安装的设置在环境变量的Python解释器,如果需要修改称虚拟解释器conda则可以使用以下方法软件中央上部选择"显示并运行命令"Python:选择解释器选择需要的解释器......
  • 关于K8S亲和性的解释
    kubernetes提供了一种亲和性调度(Affinity)。它在NodeSelector的基础之上的进行了扩展,可以通过配置的形式,实现优先选择满足条件的Node进行调度,如果没有,也可以调度到不满足条件的节点上,使调度更加灵活。Affinity主要分为三类:nodeAffinity(node亲和性):以node为目标,解决pod可以调......
  • 解释器模式
    目录解释器模式概述结构案例实现优缺点使用场景解释器模式概述如上图,设计一个软件用来进行加减计算。我们第一想法就是使用工具类,提供对应的加法和减法的工具方法。//用于两个整数相加publicstaticintadd(inta,intb){returna+b;}//用于两个整数相加public......
  • 最短路
    Dijkstra算法#include<bits/stdc++.h>usingnamespacestd;typedeflonglongll;constllinf=1e18+10;vector<pair<ll,ll>>G[100000+10];lln,m,s,d[100000+10];boolvis[100000+10];voiddijkstra(){ priority_queue<pair<ll,ll>,vec......
  • 一次Java内存占用高的排查案例,解释了我对内存问题的所有疑问
      问题现象7月25号,我们一服务的内存占用较高,约13G,容器总内存16G,占用约85%,触发了内存报警(阈值85%),而我们是按容器内存60%(9.6G)的比例配置的JVM堆内存。看了下其它服务,同样的堆内存配置,它们内存占用约70%~79%,此服务比其它服务内存占用稍大。那为什么此服务内存占用稍大呢,它......