记录编号 345222 评测结果 AAAAAAAAAA
题目名称 [BYVoid S1] 埃雷萨拉斯的宝藏 最终得分 100
用户昵称 Gravatar浮生随想 是否通过 通过
代码语言 C++ 运行时间 1.196 s
提交时间 2016-11-10 21:22:29 内存使用 72.46 MiB
显示代码纯文本
#include<cstdlib>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<queue>
using namespace std;
#define maxn 55
int t[maxn][maxn],len,head[maxn*maxn],n,val[maxn*maxn],m,h,dis[maxn*maxn];
int dx[4]={0,0,1,-1},dy[4]={1,-1,0,0},ans=0x7f7f7f7f;
struct edge{
	int to,next,dis;
}a[2510*2510];
struct node{
	int x,dis;
	node(int a,int b){
		x=a;dis=b;
	}
	bool operator<(const node&a)const{
		return a,dis<dis;
	}
};
void insert(int x,int y,int z){
	len++;a[len].to=y;a[len].next=head[x];a[len].dis=z;head[x]=len;
	//cout<<len<<" "<<x<<" "<<y<<" "<<z<<endl;
}
void dijs(int x){
	priority_queue<node>q;
	memset(dis,0x7f,sizeof dis);
	dis[x]=val[t[1][x]];q.push(node(x,val[t[1][x]]));
	while(!q.empty()){
		node k=q.top();q.pop();
		if(k.dis!=dis[k.x])continue;
		if(k.dis>h)continue;
		for(int i=head[k.x];i;i=a[i].next){
			int to=a[i].to;
			if(dis[to]>dis[k.x]+a[i].dis){
				dis[to]=dis[k.x]+a[i].dis;
				q.push(node(to,dis[to]));
			}
		}
	}
	for(int i=1;i<=n;i++){
		if(dis[(n-1)*n+i]<h)ans=min(ans,dis[(n-1)*n+i]);
	}
}		
int main(){
	freopen("eldrethalas.in","r",stdin);
	freopen("eldrethalas.out","w",stdout);
	scanf("%d%d%d",&n,&m,&h);
	for(int i=1;i<=m;i++)scanf("%d",&val[i]);
	for(int i=1;i<=n;i++)
	for(int j=1;j<=n;j++)scanf("%d",&t[i][j]);
	for(int i=1;i<=n;i++)
	for(int j=1;j<=n;j++){
		for(int k=0;k<4;k++){
			int xx=i+dx[k],yy=j+dy[k];
			if(xx<1||yy<1||xx>n||yy>n)continue;
			else insert((i-1)*n+j,(xx-1)*n+yy,val[t[xx][yy]]);
		}
		for(int p=1;p<=n;p++)
		for(int q=1;q<=n;q++){
			if(p==i&&q==j)continue;
			if(t[i][j]!=t[p][q])continue;
			insert((i-1)*n+j,(p-1)*n+q,0);
		}
	}
	for(int i=1;i<=n;i++)dijs(i);
	if(ans<0x7f7f7f7f)printf("%d",h-ans);
	else printf("NO");
	//while(1);
}