[Baltic 2011]Lamp BZOJ2346
分析:
建图最短路,比较裸。
我们可以考虑,如果是‘\’那么,左上连右下边权为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; }