0-1 BFS

前言:做这道题发现dij过不了,意识到自己不会0-1 BFS,遂查,发现网上的解释很多都不清楚,oi wiki 好像没讲,自己证明了一下。

算法过程:

用于求边权为 \(0\)\(1\) 的图的最短路。方法就是把 dij 的单调队列换成一个 deque,每次更新如果用边权为 \(0\) 的边,把新的点放到队首,反之放到队尾,复杂度 \(\Theta (n+m)\)

为什么是对的:

根据 dij 的正确性证明,只需证 deque 内的点的 \(dis\) 单调不增。
下证明 deque 内的数的 \(dis\) 事实上形如 \([d,d,...d,d+1,d+1,...,d+1]\)

  1. 初始时,deque 内的数的 \(dis\)\([0]\),符合要求
  2. 每次拓展时取链头 \(u\)\(dis_u=d\) 故当更新到边权为 \(0\)\(dis_v=d\),放在队头,满足性质,否则 \(dis_v=d+1\),放在队尾,仍满足性质。

综上,命题成立

复杂度:

类似 dij,每一个点都仅会被用来拓展一次,故每一条边也仅会被用来拓展一次。而每一次入队操作都只能由一条边造成,故复杂度为 \(\Theta(n+m)\)

posted @ 2023-09-21 22:04  tybbs  阅读(19)  评论(0编辑  收藏  举报