比赛 NOIP2008集训模拟1 评测结果 ATAAAAATTT
题目名称 埃雷萨拉斯的宝藏 最终得分 60
用户昵称 zqzas 运行时间 0.000 s
代码语言 C++ 内存使用 0.00 MiB
提交时间 2008-11-10 11:25:16
显示代码纯文本
#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],dis[MAXP],data[MAXP][MAXP],adj[MAXP][MAXP];

void dij(int src)
{
	int i,j,x,y,min,visit[MAXP]={0};
	/*for (k=1;k<=p;k++)
		for (i=1;i<=p;i++)
			for (j=1;j<=p;j++)
			{
				if (i!=j && k!=i && k!=j)
					if (data[i][k]+data[k][j]<data[i][j])
						data[i][j]=data[i][k]+data[k][j];
			}*/
	memset(dis,127,sizeof(dis));
	dis[src]=0;
	for (i=1;i<=p;i++)
	{
		//getMin
		min=INF;
		for (j=1;j<=p;j++)
			if (visit[j]==0 && dis[j]<min)
			{
				min=dis[j];
				x=j;
			}
		visit[x]=1;
		for (j=1;j<=adj[x][0];j++)
		{
			y=adj[x][j];
			if (visit[y]==0 && dis[x]+data[x][y]<dis[y])
				dis[y]=dis[x]+data[x][y];
		}
	}
}

void run()
{
	int j1,j2,c1,c2,done[MAXP]={0};
	ans=INF;
	for (j1=1;j1<=n;j1++)
	{
		c1=map[1][j1];
		dij(c1);
		done[c1]=1;
		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)
					{
						data[c1][c2]=cost[c2];
						adj[c1][++adj[c1][0]]=c2;
					}
				}
			}
		}
			
	
}

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