bzoj2346 [Baltic 2011]Lamp(建图spfa)

来源:互联网 发布:python crash course 编辑:程序博客网 时间:2024/06/06 23:53

对角线建边,以前有的边权为0,没有的边权为1,跑最短路。

#include <bits/stdc++.h>using namespace std;#define ll long long#define inf 0x3f3f3f3f#define N 510inline int read(){    int x=0,f=1;char ch=getchar();    while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}    while(ch>='0'&&ch<='9') x=x*10+ch-'0',ch=getchar();    return x*f;}int n,m,h[N*N],num=0,d[N*N];bool inq[N*N];char s[N];struct edge{    int to,next,val;}data[N*N*4];inline void add1(int x,int y,int val){    data[++num].to=y;data[num].next=h[x];h[x]=num;data[num].val=val;    data[++num].to=x;data[num].next=h[y];h[y]=num;data[num].val=val;}void spfa(){    deque<int>q;memset(d,0x3f,sizeof(d));    q.push_back(1);d[1]=0;inq[1]=1;    while(!q.empty()){        int x=q.front();q.pop_front();inq[x]=0;        for(int i=h[x];i;i=data[i].next){            int y=data[i].to;            if(d[x]+data[i].val<d[y]){                d[y]=d[x]+data[i].val;                if(!inq[y]){                    inq[y]=1;                    if(!q.empty()&&d[y]<d[q.front()]) q.push_front(y);                    else q.push_back(y);                }            }        }    }}int main(){//  freopen("a.in","r",stdin);    n=read();m=read();    for(int i=1;i<=n;++i){        scanf("%s",s+1);        for(int j=1;j<=m;++j)            if(s[j]=='/'){                add1((m+1)*(i-1)+j,(m+1)*i+j+1,1);                add1((m+1)*(i-1)+j+1,(m+1)*i+j,0);            }            else{                add1((m+1)*(i-1)+j,(m+1)*i+j+1,0);                add1((m+1)*(i-1)+j+1,(m+1)*i+j,1);            }    }    spfa();    if(d[(m+1)*(n+1)]==inf) puts("NO SOLUTION");    else printf("%d\n",d[(m+1)*(n+1)]);    return 0;}
原创粉丝点击