[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;
}

  

猜你喜欢

转载自www.cnblogs.com/Winniechen/p/9095460.html