比赛 |
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;
}