【模板】最短路模板+最小路径生成树
Dijkstra
O
(
(
n
+
m
)
l
o
g
n
)
O((n+m)logn)
O((n+m)logn)
只能用于正权图
Bellman-Ford
O ( n m ) O(nm) O(nm)
如果n-1次松弛后仍然不满足三角形不等式,则说明有负环(这个环内每次都可以更新,因为一次比一次小),否则就没有负环(可以收敛)。
注意:有负环时bellman算法已经崩溃了,不能作为任何答案,所以虽然在负权下可以工作,但容易RE
判环+输出路径
Spfa
O ( k n ) O(kn) O(kn),但容易被卡(尤其是稠密图)
基于队列优化的bellman算法,负权图同样可以工作
可以用 n u m [ ] num[] num[]数组记录路径长度,只要有松弛操作就令 n u m [ v ] = n u m [ u ] + 1 num[v]=num[u]+1 num[v]=num[u]+1,若 n u m [ v ] > n num[v]>n num[v]>n则说明有负环
最小路径生成树
eg.黑暗城堡
解析:对于1到 i i i的最短路,事实上存在 j j j使 d i s [ i ] = d i s [ j ] + G ( j , i ) dis[i]=dis[j]+G(j,i) dis[i]=dis[j]+G(j,i)
这给我们启发: j j j的最短路与 i i i的最短路存在联系
如果把每一个 i i i与前继 j j j连起来,可以发现一定找得到这个 j j j,那么 i i i的最短路一定由 j j j贡献,就只需要考虑 j j j的最短路了。
题目又告诉我们这是一个树形结构,且没有负边,边是n-1,刚好n个点,所以每个点 i i i只能找一个前继点 j j j,我们只需统计num[i]表示满足条件的j的个数,然后把num[1~n]相乘即可。
至于求dis[i],可以用dijkstra预处理完成。
__EOF__

本文链接:https://www.cnblogs.com/cqbzly/p/17530412.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· DeepSeek 开源周回顾「GitHub 热点速览」