现在的位置: 首页 > 综合 > 正文

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

2018年04月24日 ⁄ 综合 ⁄ 共 1215字 ⁄ 字号 评论关闭
#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;
}

抱歉!评论已关闭.