最短路
1|0基本算法:
使用条件:无负权边
每次取出 还未取出过的 最小的节点更新其他节点
正确性证明:因为是 最小的节点,别的节点不可能有一条路径走到这个节点且 更小(路径为正)
stl-pq默认是大根堆,用负号处理为小根堆
队列优化的
spfa:每次扫描在队列里的节点
为了避免重复入队,设置
- floyd
处理多元最短路
表示只走过若干个编号 的节点 到 的最短路
去掉 这一维,但要把 放在最前面枚举,因为是阶段
2|0一些例题
2|1Telephone Lines
可以使
- 思路一:有后效性
表示到第 个节点,已经用掉 个机会的费用
转移:
使用机会:
不使用机会:
因为有后效性(兜两圈),使用spfa解决
时间复杂度
- 思路2:二分答案
发现答案是单调的(用券不会使答案增加),使用二分法
对于 ,大于 的边为 ,小于等于的为
判定 到 的距离是否小于 即可
时间复杂度
2|2最优贸易(反图)
这个题做法还是挺有意思的
从1到n上的路,因为只能交易一次,所以找一个最大一个最小相减是差价
直接遍历一次是不可以的,因为可能选到的最大值在最小值之前出现
于是考虑两遍,正+反
正序处理从
反序处理从
答案就是两者之差,这样可以保证不会出现最大值在最小值之前的情况
有个疑惑:点权的非dag能用dijkstra吗?因为是min可能有后效性,但实测ac
实证:确实是不可以的,但数据太水水过了 还是用spfa比较好
2|3道路和航线 (分层图+拓扑排序+dij)
题目描述:道路双向(边权正),航线单向 (边权可负),不成环
不能直接
这个题的性质挺特殊
对于双向道路,合并成一个连通块
单向的负边权连接这些连通块
联通块内部边权为正,可以dij
连通块之间是单向道路,是个
最终思路:
- 形成连通块
- 把
在的连通块和所有入度为 的连通块加入 - 按照拓扑排序的顺序遍历连通块,确保前面的连通块dij完成后再进行后面连通块的处理
- 连通块内部用dijkstra处理最短路
2|4Sightseeing Tree(无向图最小环问题)
无向图最小环问题使用
使用
需要输出路径,根据floyd更新的规则,记录中转节点
值得一提的是有向图最小环问题
枚举启点
结束后把
求到的dis[s]就是这个包含这个点的最小环(因为有向图不会出现1条路径走过去又走回来的情况)
时间复杂度比
__EOF__
作 者:哈奇莱特
出 处:https://www.cnblogs.com/lighthqg/p/17679370.html
关于博主:这个人很懒 什么也没有留下
版权声明:未获得本人同意请勿随意转载
声援博主:制作不易 点个赞吧
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 【杂谈】分布式事务——高大上的无用知识?