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]\)。
- 初始时,deque 内的数的 \(dis\) 为 \([0]\),符合要求
- 每次拓展时取链头 \(u\),\(dis_u=d\) 故当更新到边权为 \(0\) 的 \(dis_v=d\),放在队头,满足性质,否则 \(dis_v=d+1\),放在队尾,仍满足性质。
综上,命题成立
复杂度:
类似 dij,每一个点都仅会被用来拓展一次,故每一条边也仅会被用来拓展一次。而每一次入队操作都只能由一条边造成,故复杂度为 \(\Theta(n+m)\)。