记录编号 7865 评测结果 AAAAAAAAAA
题目名称 [BYVoid S1] 埃雷萨拉斯的宝藏 最终得分 100
用户昵称 Gravatarzqzas 是否通过 通过
代码语言 C++ 运行时间 0.605 s
提交时间 2008-11-11 22:13:30 内存使用 48.37 MiB
显示代码纯文本
#include <iostream>
#include <fstream>

#define MAXN 53
#define MAXP 2510
#define INF 999999999

using namespace std;

ifstream fin ("eldrethalas.in");
ofstream fout("eldrethalas.out");

const int Dir[4][2]={{0,1},{0,-1},{1,0},{-1,0}};
int n,p,hp,ans,cost[MAXP],map[MAXN][MAXN],data[MAXP][MAXP],dis[MAXP],adj[MAXP][MAXP],que[MAXP];

void dij(int src)
{
	const int P=MAXP-5;
	int i,x,y,head,tail,isin[MAXP]={0};
	memset(dis,127,sizeof(dis));
	dis[src]=0;
	que[0]=src;
	head=-1;
	tail=0;
	isin[src]=1;
	while (head<tail)
	{
		x=que[(++head)%P];
		//relax
		for (i=1;i<=adj[x][0];i++)
		{
			y=adj[x][i];
			if (dis[x]+data[x][y]<dis[y])
			{
				dis[y]=dis[x]+data[x][y];
				if (isin[y]==0)
				{
					isin[y]=1;
					que[(++tail)%P]=y;
				}
			}
		}
		isin[x]=0;
	}
}

void run()
{
	int j1,j2,c1,c2,done[MAXP]={0};
	ans=INF;
	for (j1=1;j1<=n;j1++)
	{
		c1=map[1][j1];
		dij(c1);
		for (j2=1;j2<=n;j2++)
		{
			c2=map[n][j2];
			if (dis[c2]+cost[c1]<ans)
				ans=dis[c2]+cost[c1];
		}
	}
	ans=hp-ans;
	if (ans>0)
		fout<<ans;
	else
		fout<<"NO";
}

void ini()
{
	int i,j,d,a,b,c1,c2;
	fin>>n>>p>>hp;
	for (i=0;i<=p;i++)
		for (j=0;j<=p;j++)
			if (i!=j)
				data[i][j]=INF;
	for (i=1;i<=p;i++)
	{
		fin>>cost[i];
	}
	for (i=1;i<=n;i++)
		for (j=1;j<=n;j++)
			fin>>map[i][j];
	for (i=1;i<=n;i++)
		for (j=1;j<=n;j++)
		{
			c1=map[i][j];
			for (d=0;d<4;d++)
			{
				a=i+Dir[d][0];
				b=j+Dir[d][1];
				if (a>=1 && a<=n && b>=1 && b<=n)
				{
					c2=map[a][b];
					if (c1!=c2)
					{
						if (data[c1][c2]==INF)
							adj[c1][++adj[c1][0]]=c2;
						data[c1][c2]=cost[c2];
					}
				}
			}
		}
			
	
}

int main()
{
	ini();
	run();
	return 0;
}