最短路学习笔记
最短路学习笔记
这是一篇复习笔记,相对写的比较简单,勿喷 qwq。
本文均考虑双向边。
1.
利用了 的思想,是最基础的最短路算法。
我们考虑 表示 到 的最短路径。初始化为一个无穷大的值。
如果有 和 之间有连边的话,我们就先把 和 赋成这最初的值,也就是初始化。
考虑转移,我们枚举一个中转的点 , 到 的路径就可以表示成 到 的路径,加上 到 的路径。
所以方程就是:
在实现的时候应该注意, 要放在最外层循环。
如果 或者 ,或者 和 都没有路径之间,由于我们初值是一个无穷大的值,按照如上方程,不可能更新 。
时间:,空间 。
除非 较小,不然不常用,一般是用在双重 上。
同时一般使用邻接矩阵存图。
2.
通过这个算法,我们可以快速的求出从一个指定点 到任意点的最短路,但是前提是边权必须为非负数。
对于一个点,我们每次选择和他连边边权最小的点一直往下走,同时对这个点相连的所有点进行最短路的更新。也就是贪心的思想,这样可以保证更新的点的最短路一定是当前能走到的最短的路径。
注意走过的点不可以不可以重复,避免没用的更新。
这样做的时间是 的,考虑进行优化。
由于我们枚举边权最小的点进行更新的时候,时间是 的,如果我们考虑使用小根堆维护当前的边权最小,那就可以达到 的时间复杂度。
时间复杂度:
空间复杂度 :
3.
考虑 的更新的时候,是通过当前遍历到的 ,不断地对 进行更新最短路,也就是所谓的“松弛操作”。
我们考虑用一个队列维护可能可以进行松弛操作的点,对于一个点来说,如果他进行了松弛操作,显然他所连接的其他节点也有可能进行松弛操作,我们就把他们入队。
注意,一个节点不可以重复入队。
关于 ,他死了。
死的原因在于,由于他的本质是 算法,本质就是对每一个点,对图上所有的边都进行一次松弛操作,所以最坏的情况下,他可能被卡到 的时间复杂度。
但是他的优势在于,他可以处理带有负权的图,同时可以判断负环。
时间:~。
空间:。
4. 分层图最短路
就是,大概用在图的结构不修改,但是边权可以被改变 次。
做法大概是你把原图复制 次,从 开始标号。看成一个一个“层”,在层与层之间,对原图可以操作的边在层和层之间的对应点连上单向边。
这下你就可以发现,你走完多少层,就相当于进行了多少次操作。因为你连的是单向边,所以你不能从 层跳回去 层了。所以上面的结论显然。
然后你再跑最短路即可。
对于你跑最短路中可能经过相同的边,就是在层和层之间相同的边。不难发现这样一定不优,这不会被统计到答案。
5. 全源最短路
不会,咕咕咕。到时候学了再补。
6.次短路& 短路
不会,咕咕咕,到时候学了再补。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现