bzoj 2346: [Baltic 2011]Lamp spfa

来源:互联网 发布:香港专业教育学院 知乎 编辑:程序博客网 时间:2024/05/17 08:08

题意

2255是一个傻X,他连自己家灯不亮了都不知道。
某天TZ大神路过他家,发现了这一情况,
于是TZ开始行侠仗义了。
TZ发现是电路板的问题,
他打开了电路板,发现线路根本没有连上!!
于是他强大的脑力可以使某个格子上的线路从\变为/,
或者从/变为\。
2255不会电路(因为他什么都不会),但是他想知道TZ最少要用多少次脑力才能使他家的灯变亮。
如果无法变亮,输出“NO SOLUTION”。

n,m<=500

分析

直接建图跑最短路。。。

代码

#include<iostream>#include<cstdio>#include<cstdlib>#include<cstring>#include<algorithm>#include<queue>using namespace std;const int N=260005;const int inf=0x3f3f3f3f;int n,m,dis[N],last[N],cnt;char ch[N];struct edge{int to,next,w;}e[N*8];bool vis[N];queue<int> que;int point(int x,int y){    return (x-1)*(m+1)+y;}void addedge(int u,int v,int w){    e[++cnt].to=v;e[cnt].w=w;e[cnt].next=last[u];last[u]=cnt;    e[++cnt].to=u;e[cnt].w=w;e[cnt].next=last[v];last[v]=cnt;}void spfa(){    for (int i=1;i<=(n+1)*(m+1);i++) dis[i]=inf;    dis[1]=0;que.push(1);vis[1]=1;    while (!que.empty())    {        int u=que.front();que.pop();        for (int i=last[u];i;i=e[i].next)            if (dis[u]+e[i].w<dis[e[i].to])            {                dis[e[i].to]=dis[u]+e[i].w;                if (!vis[e[i].to]) que.push(e[i].to),vis[e[i].to]=1;            }        vis[u]=0;    }}int main(){    scanf("%d%d",&n,&m);    for (int i=1;i<=n;i++)    {        scanf("%s",ch+1);        for (int j=1;j<=m;j++)            if (ch[j]=='/')            {                addedge(point(i,j+1),point(i+1,j),0);                addedge(point(i,j),point(i+1,j+1),1);            }            else            {                addedge(point(i,j),point(i+1,j+1),0);                addedge(point(i,j+1),point(i+1,j),1);            }    }    spfa();    if (dis[(n+1)*(m+1)]<inf) printf("%d",dis[(n+1)*(m+1)]);    else puts("NO SOLUTION");    return 0;}
原创粉丝点击