rt,蒟蒻求助TLE
用的双端队列宽搜,理论上复杂度为500*500啊
# include <cstdio>
using namespace std;
int n,p,l = 1000011,r = 1000010,lk[300010],vis[300010],hp,ans = 0x3f3f3f3f,a[666][666];
char x;
struct sth{
int ue,we,po;
}e[1000010];
struct node{
int er,bu;
}q[2000010];
void add(int uu,int vv,int ww)
{
e[++hp] = {vv,lk[uu],ww},lk[uu] = hp;
e[++hp] = {uu,lk[vv],ww},lk[vv] = hp;
}
void bfs()
{
r++;
q[r] = {1,0};
while (l <= r)
{
node nw = q[l];
if (vis[nw.er]) continue;
vis[nw.er] = 1;
if (nw.er == (n + 1) * (p + 1))
{
ans = nw.bu;
return ;
}
l++;
for (int i = lk[nw.er]; i; i = e[i].we)
{
if (vis[e[i].ue]) continue;
if (e[i].po)
{
r++;
q[r] = {e[i].ue,nw.bu + 1};
}
else
{
l--;
q[l] = {e[i].ue,nw.bu};
}
}
}
}
int main()
{
scanf("%d %d",&n,&p);
for (int i = 1; i <= n; i++)
{
for (int j = 1; j <= p; j++)
{
scanf("\n%c",&x);
if (x == '/') a[i][j] = 0;
if (x == '\\') a[i][j] = 1;
}
}
for (int i = 1; i <= n; i++)
{
for (int j = 1; j <= p; j++)
{
add((i - 1) * (p + 1) + j,i * (p + 1) + j + 1,(a[i][j] == 0));
add((i - 1) * (p + 1) + j + 1,i * (p + 1) + j,a[i][j]);
}
}
bfs();
if (ans != 0x3f3f3f3f) printf("%d",ans);
else printf("NO SOLUTION");
return 0;
}