记录编号 47586 评测结果 AAAAAEEEEE
题目名称 [Poetize 9] 升降梯上 最终得分 50
用户昵称 Gravatarfeng 是否通过 未通过
代码语言 C++ 运行时间 0.408 s
提交时间 2012-11-02 10:43:32 内存使用 7.11 MiB
显示代码纯文本
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<iostream>
#include<cmath>
using namespace std;
struct node{
	int s,nex;
}a[40100];
struct edge{
	int y,v,nex;
}e[800000];
int n,m,p;
int dis[40010];
bool f[40010];
int queue[10000];
int aa[40010];
void add(int x,int y,int v){
	p++;
	a[x].s++;
	e[p].y=y;
	e[p].v=v;
	e[p].nex=a[x].nex;
	a[x].nex=p;
}
void init()
{
	for (int i=1;i<=n;i++)
		for (int j=1;j<=m;j++)
		{
					int x=i*m+j;
					int y=i*m+j-1;
					if (j>1)
					add(x,y,1);
					y=i*m+j+1;
					if (j<m)
					add(x,y,1);
				}
	for (int i=1;i<=n;i++)
		for (int j=1;j<=m;j++)
			if (aa[j]!=0){
				int tmp=i+aa[j];
				if (tmp<=n && tmp>0){
					int x=i*m+j;
					int y=(i+aa[j])*m+j;
					int v=abs(aa[j])*2;
					add(x,y,v);
				}
			}
}
void SPFA(){
	int s;
	int t;
	int tmp;
	for (int i=1;i<=m;i++)
		if (aa[i]==0)
			s=m+i;
	memset(f,true,sizeof(f));
	memset(dis,1,sizeof(dis));
	memset(queue,0,sizeof(queue));
	f[s]=false;
	dis[s]=0;
	int head=0;
	int tail=1;
	queue[tail]=s;
	while (head<=tail){
		head++;
		tmp=queue[head];
		f[tmp]=true;
		t=a[tmp].nex;
		for (int i=1;i<=a[tmp].s;i++){
			if (dis[tmp]+e[t].v<dis[e[t].y]){
				dis[e[t].y]=dis[tmp]+e[t].v;
				if (f[e[t].y]){
					f[e[t].y]=false;
					queue[++tail]=e[t].y;
				}
			}
			t=e[t].nex;
		}
	}
	
}
int main()
{
	freopen("updown.in","r",stdin);
	freopen("updown.out","w",stdout);
	scanf("%d%d",&n,&m);
	for (int i=1;i<=m;i++)
		scanf("%d",&aa[i]);
	p=0;
	init();
	SPFA();
	int ans=dis[1];
	int o=12;
	for (int i=n*m+1;i<=n*m+m;i++)
		if (dis[i]<ans) ans=dis[i];
	if (ans==dis[0]) ans=-1;
	printf("%d\n",ans);
	return 0;
}