思路:因为所有的ai都小于d,所以可以转换成简单的Dijkstra,另外Floyd其实也可以,因为数据量才100.
AC代码如下:
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<cmath>
#include<cstdlib>
using namespace std;
#define INF 1000000000
#define MAX 110
typedef long long ll;
int dis[MAX][MAX],f[MAX],d,x[MAX],y[MAX],a[MAX];
bool vis[MAX];
int main()
{ int T,t,n,m,i,j,k,ret,pos;
scanf("%d%d",&n,&d);
for(i=2;i<n;i++)
scanf("%d",&a[i]);
for(i=1;i<=n;i++)
scanf("%d%d",&x[i],&y[i]);
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
{ dis[i][j]=(abs(x[i]-x[j])+abs(y[i]-y[j]))*d;
if(i!=j && j!=1 && j!=n)
dis[i][j]-=a[j];
}
f[1]=0;
for(i=2;i<=n;i++)
f[i]=INF;
for(i=1;i<=n;i++)
{ ret=INF;
for(j=1;j<=n;j++)
if(!vis[j] && f[j]<ret)
{ pos=j;
ret=f[j];
}
vis[pos]=1;
for(j=1;j<=n;j++)
f[j]=min(f[j],f[pos]+dis[pos][j]);
}
printf("%d\n",f[n]);
}