广度优先搜索讲解
2026-08-19 20:03:41
发布于:浙江
大家好!今天我来讲广度优先搜索了awa
但是我不会讲啊qwq,那只能放几道习题边做边讲了
P2446 [SDOI2010] 大陆争霸
哇!看起来好麻烦……既要尽快到达指定地点自爆,又要等别的机器人破开保护……这怎么做啊!
我们可以进行 次,每次跑一遍最短路,然后对破坏节点的时间取个max,但是这样是 的,过不了啊!
先别急,我们回想一下最短路是怎么求的。
我们开个优先队列,遍历每一条边,如果新的距离小于当前距离,就把它放进优先队列。这样就能保证每次取出来的时间是上升的了。
再看到这道题,就算要对保护节点取max,还是没有打破遍历时间是上升的这个规则。所以,对于每个出队(被破坏)的点,我们可以分别遍历它能到达的点和它所保护的点,如果时间更优了,那么就更新距离并入队。这样就是对的了,时间复杂度也做到了 。
这题真好玩!
P4366 [Code+#4] 最短路
这道题看上去直接优先队列广度优先搜索就行了……但是真的这么简单吗?
重新读一遍题,发现这题的边数高达 !数据范围也是惊人的 TwT
原来的最短路其实就是看它们每一位是否不同,那每两个点连一条边实在太浪费了!
我们可以将点 连向所有只有一位不同的点,这样也可以看它们每一位是否不同,和之前的图等价的,但是边数只有 !
然后就可以开心地优先队列广搜了~~~
P2993 [FJOI2014] 最短路径树问题
题目是给定一张无向图,求出它字典序最小的最短路径树,后面叽里咕噜说一大串听不懂,就不讲啦~
那怎么求字典序最小的最短路径树呢?
我们求出最短路径后,将邻居按编号排序,从1开始dfs,遇到可能是最短路径的边就加入。这样贪心肯定是对的,而且也能保证字典序最小。
老师还讲了P2934和P6545,但是我太弱了听不懂……
P9370 [APIO2023] 赛博乐园 / cyberland
对于时间可以无限次消成 的点,那先到达这个点然后再去终点和以它为源点去终点没有区别,所以可以一起加入源点广搜。
那么对于时间减半的点呢?最多只能用 次,感觉有点不太好做……
这时候,就要用到,大名鼎鼎的,分层图最短路!
将图分为 层,使用能力相当于往上走一层,这么建图和DP一样,没有后效性,也就是不会影响之前的点。
这样,我们就有了 的做法,但是 啊……
我们发现,当 很大的时候,前面的时间就算很长,也相当于消成没有了!所以我们只要找到这个临界点,大概是 ,对 取个min就行了!
P2865 [USACO06NOV] Roadblocks G
最短路都很好做,直接优先队列广搜就行了。但是次短路呢?为什么会有人研究第二短的路啊!!!
但其实也不算太难,在最短路的基础上稍微改改就行了。
具体来说,就是再开一个数组记录最短路,对于当前队列,如果有一条边更优,那它就成为最短路,原先的最短路成为次短路;否则它就和次短路比较qwq
但是!这里就不能标记vis了!因为有可能这个时候它的次短路还没更新完!这时,我们的剪枝就得改成当前距离小于当前次短路了。这样,由于可以来回走,每个点最多会被松弛两次(最坏情况第二次是从自己往返走一条边回来),时间复杂度是 不变。
全部评论 3
P2934和P6545可以发给我看一下吗,我看看我能不能看懂
1小时前 来自 广东
0你可以看题解……
1小时前 来自 浙江
0洛谷上的
1小时前 来自 浙江
0
建议再加上伪代码
1小时前 来自 广东
0我太懒了……但以后会补上的

1小时前 来自 浙江
0
qwq
1小时前 来自 浙江
0




















有帮助,赞一个