您的位置:首页 > 其它

2346: [Baltic 2011]Lamp (SPFA+SLF优化)

2014-07-16 13:27 501 查看
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cmath>
#include<cstring>
#include<algorithm>
#define mod 260000
using namespace std;
int n,m,dist[260000],dui[260000];
char map[510][510];
int sz,to[3000010],pre[3000010],v[3000010],last[260000];
bool mark[260000];
inline void Ins(int a,int b,int c)
{
sz++;to[sz]=b;v[sz]=c;pre[sz]=last[a];last[a]=sz;
}
inline int P(int x,int y)
{
return (x-1)*(m+1)+y;
}
void spfa()
{
memset(dist,127,sizeof(dist));
int tou=0,wei=1,now,i,next;
dui[1]=1;dist[1]=0;mark[1]=1;
while(tou!=wei)
{
tou=(tou+1)%mod;
now=dui[tou];mark[now]=0;
for(i=last[now];i;i=pre[i])
if(dist[to[i]]>dist[now]+v[i])
{
dist[to[i]]=dist[now]+v[i];
if(!mark[to[i]])
{
next=(tou+1)%mod;
if(tou==wei || dist[to[i]]<=dist[dui[next]])
{
dui[tou]=to[i];mark[to[i]]=1;tou=(tou-1+mod)%mod;
}
else
{
wei=(wei+1)%mod;dui[wei]=to[i];mark[to[i]]=1;
}
}
}
}
}
void solve()
{
if((n+m)&1)
{
printf("NO SOLUTION\n");
return;
}
spfa();
printf("%d\n",dist[(n+1)*(m+1)]);
}
int main()
{
int i,j,p1,p2,p3,p4;
scanf("%d%d",&n,&m);
for(i=1;i<=n;i++) scanf("%s",map[i]+1);
for(i=1;i<=n;i++) for(j=1;j<=m;j++)
{
p1=P(i,j);p2=P(i,j+1);p3=P(i+1,j);p4=P(i+1,j+1);
if(map[i][j]=='/')
{
Ins(p1,p4,1);Ins(p4,p1,1);
Ins(p2,p3,0);Ins(p3,p2,0);
}
else
{
Ins(p1,p4,0);Ins(p4,p1,0);
Ins(p2,p3,1);Ins(p3,p2,1);
}
}
solve();
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: