[Baltic 2011]Lamp BZOJ2346

时间:2021-11-14 21:54:51

分析:

建图最短路,比较裸。

我们可以考虑,如果是‘\’那么,左上连右下边权为0,左下连右上边权为1,反之亦然。

卡裸spfa,加点优化能过,我就直接改成的堆优化Dijkstra

附上代码:

#include <cstdio>
#include <cmath>
#include <iostream>
#include <queue>
#include <algorithm>
#include <cstring>
using namespace std;
#define N 505
#define M 505550
struct node{int to,next,val;}e[M<<1];
int head[M],cnt,vis[M],dis[M],n,m,map[N][N],tot;
char s[N];
void add(int x,int y,int z){e[cnt].to=y;e[cnt].next=head[x];e[cnt].val=z;head[x]=cnt++;}
int Dijkstra()
{
memset(dis,0x3f,sizeof(dis));
dis[1]=0;
priority_queue <pair<int,int> >q;
q.push(make_pair(-dis[1],1));
while(!vis[tot]&&!q.empty())
{
int x=q.top().second;q.pop();
if(vis[x])continue;
vis[x]=1;
for(int i=head[x];i!=-1;i=e[i].next)
{
int to1=e[i].to;
if(dis[to1]>dis[x]+e[i].val)
{
dis[to1]=dis[x]+e[i].val;
q.push(make_pair(-dis[to1],to1));
}
}
}
return dis[tot];
}
int main()
{
memset(head,-1,sizeof(head));
scanf("%d%d",&n,&m);
for(int i=1;i<=n+1;i++)
{
if(i!=1)scanf("%s",s+2);
for(int j=1;j<=m+1;j++)
{
map[i][j]=++tot;
if(i!=1&&j!=1)
{
if(s[j]==92)
{
add(map[i-1][j-1],map[i][j],0);
add(map[i][j],map[i-1][j-1],0);
add(map[i][j-1],map[i-1][j],1);
add(map[i-1][j],map[i][j-1],1);
}else
{
add(map[i-1][j-1],map[i][j],1);
add(map[i][j],map[i-1][j-1],1);
add(map[i][j-1],map[i-1][j],0);
add(map[i-1][j],map[i][j-1],0);
}
}
}
}
int t=Dijkstra();
if(t==0x3f3f3f3f)puts("NO SOLUTION");
else printf("%d\n",t);
return 0;
}