首页 > 其他分享 >01bfs

01bfs

时间:2023-11-15 15:37:12浏览次数:35  
标签:dij 队列 双端 cdots 01bfs dis

今天写一个最短路题边权为 \(0\) 或 \(1\),我说这不一眼 \(dij\) 么?结果题解区全部写的 \(O(n+m)\) 的 \(01bfs\) 。

好家伙我居然一直不知道这么个东西,花了一个小时看会了,写一下原理。

实现的方法很简单,就是一个双端队列,去 \(nm\) 的 \(deque\),我有手,可以手写。

在这里讲一下正确性:

众所周知 \(dij\) 的优先队列是按距源点的距离排序的。

在一开始,设我们双端队列里的 \(dis\) 值为 \(0,0,0,1,1,1\)。

很明显,在访问到第一个 \(1\) 之前,你访问到的全是 \(dis=0\) 的点

而 \(dis=0\) 的点拓展出来的点 \(dis\) 不会大于 \(1\)。

也就是说,当这个队列中不存在 \(dis=0\) 的点时,队列的的 \(dis\) 情况一定是 \(1,1,1,1,\cdots\)。

以此类推,当这个队列中不存在 \(dis=x\) 的点时,队列的的 \(dis\) 情况一定是 \(x+1,x+1,x+1,x+1,\cdots\)。

真滴是很不错,其他的部分你直接按照 \(dij\) 写就是了。

忘了说一点,因为每次更新成功都会将点加入队列,所以最多会加入 \(O(m)\) 次。

这 \(m\) 次可能都是往前面加,也可能都是往后面加,所以双端队列大小申请为 \(2m\),从 \(m\) 的位置开始。

\(Easy!\)

标签:dij,队列,双端,cdots,01bfs,dis
From: https://www.cnblogs.com/yhy-trh/p/01bfs.html

相关文章

  • 「WOJ 4701」Walk 虚点建图+01bfs
    前言模拟赛中,yzh遇到了这道题,但由于yzh没有学过01bfs。。。所以就一直在优化这道题,导致浪费了很长时间(但nfls的数据太水,dij和spfa都能过)Description给你一个\(n\)个......
  • 必须经过关键点或达成某些状态的单源最短路-01bfs
    https://ac.nowcoder.com/acm/contest/45670/D题目描述:小竹成功从家里逃了出来,他决定去小胖家避一避。但是小胖要求小竹带一个刺激度大于xx的游戏才能去他家。为了防......
  • 01bfs 小专题
    概括:边权为0/1的图求最短路,常见于网格图的bfs。本质是特殊的dijkstra,因为边权只有0/1,不再需要优先队列维护Luogu4667注意需要维护的是格点的坐标和格子的坐标,然后边权如......