>Link
luogu P4667
(ybt进不去,只能去洛谷做题🤯)
>解题思路
一开始我的做法是正常的bfs,记录当前位置,如果遇到可以更新并且不在队列中的点就加进队列,然而这样写tle了😰
正解:
首先考虑建边,把每个格子的格点设为端点,原本就存在的路径就建一条边权为 0 0 0的边,再建一条与之相反的边,边权为 1 1 1(也就是转动后的边)
然后再进行bfs,对于边权只有 0 0 0和 1 1 1的边,我们可以使用双端队列:
遇到可以更新的点进行更新,如果当前这条边边权为 0 0 0,就从队头加入队列,边权为 1 1 1就从队尾加入
这样可以使得我们优先处理边权为 0 0 0的边们,处理完 0 0 0的再处理 1 1 1的(hky大爷说:类似把边权为0的边所连的点合并成一个点)。事实上,如果这样操作,我们可以越早找出从起点到一个点的最短路径,减少同一个点入队的次数,从而提高效率
>代码
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm