看成一张图 如果是原来摆成的状态意为着边权为0,否则为1,在跑最短路
这里很特殊的一点是只有0,1所以我们扩展的时候 若边为0 则将扩展的点插入到队首 否则插入到队尾 这需要一个deque 但是可以维护广搜队列任意时刻的两段性和单调性
没有vis数组 因为不能保证第一次扩展到就是最短 但是由于满足广搜的上述两条性质 可以保证每次出队的时候距离就是最短距离(仔细想想)所以复杂度还是O(r*c)的(因为扩展的代价几乎可以不计)
代码
//我的代码把所有位置编成了一维的序号
//事实上完全可以用二维 代码可能可以更短
#include<iostream>
#include<cstdio>
#include<queue>
#include<cstring>
using namespace std;
int r,c;
char s[505];
int h[300005],tot;
int dis[300005];
struct edge
{
int to,nxt,v;
}e[1200005];
void add_edge(int x,int y,int v)
{
e[++tot].to=y;
e[tot].nxt=h[x];
e[tot].v=v;
h[x]=tot;
}
deque<int>dq;
void bfs()
{
while(!dq.empty())
{
int x=dq.front(