题目链接:
http://codeforces.com/problemset/problem/301/B
B. Yaroslav and Time
memory limit per test256 megabytes
样例输出
2000
题意
给你二维上的n个点,两个点的时间消耗为哈密顿距离*d,且到第i个点能补充a[i]的时间,问你在起始点需要买多少的时间才能保证你能够到终点。
题解
对于每条边(u,v),边权定为d*(u到v的哈密顿距离)-a[v],然后由点n到点1跑spfa最短路,这里注意:由于题目给的d和a的范围,导致都是正权图。
代码
#include<map>
#include<set>
#include<cmath>
#include<queue>
#include<stack>
#include<ctime>
#include<vector>
#include<cstdio>
#include<string>
#include<bitset>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<functional>
using namespace std;
#define X first
#define Y second
#define mkp make_pair
#define lson (o<<1)
#define rson ((o<<1)|1)
#define mid (l+(r-l)/2)
#define sz() size()
#define pb(v) push_back(v)
#define all(o) (o).begin(),(o).end()
#define clr(a,v) memset(a,v,sizeof(a))
#define bug(a) cout<<#a<<" = "<<a<<endl
#define rep(i,a,b) for(int i=a;i<(b);i++)
#define scf scanf
#define prf printf
typedef __int64 LL;
typedef vector<int> VI;
typedef pair<int,int> PII;
typedef vector<pair<int,int> > VPII;
const int INF=0x3f3f3f3f;
const LL INFL=0x3f3f3f3f3f3f3f3fLL;
const double eps=1e-8;
const double PI = acos(-1.0);
//start----------------------------------------------------------------------
const int maxn=111;
struct Edge {
int u,v,d;
Edge(int u,int v,int d):u(u),v(v),d(d) {}
};
int n,D;
int arr[maxn];
int mat[maxn][maxn];
PII pt[maxn];
int dis(int i,int j) {
return abs(pt[i].X-pt[j].X)+abs(pt[i].Y-pt[j].Y);
}
bool inq[maxn];
LL d[maxn];
LL spfa(int s) {
queue<int> Q;
clr(inq,0);
for(int i=1; i<=n; i++) d[i]=INFL;
d[s]=0,inq[s]=true,Q.push(s);
while(!Q.empty()) {
int u=Q.front();
Q.pop();
inq[u]=false;
for(int v=1;v<=n;v++){
if(v==u) continue;
if(d[v]>d[u]+mat[u][v]){
d[v]=d[u]+mat[u][v];
if(!inq[v]){
Q.push(v); inq[v]=1;
}
}
}
}
return d[1];
}
int main() {
scf("%d%d",&n,&D);
arr[1]=arr[n]=0;
for(int i=2; i<n;i++) scf("%d",&arr[i]);
for(int i=1; i<=n; i++) {
scf("%d%d",&pt[i].X,&pt[i].Y);
}
for(int i=1; i<=n; i++) {
for(int j=1; j<=n; j++) {
if(i==j) mat[i][j]=0;
else mat[i][j]=dis(i,j)*D-arr[j];
}
}
LL ans=spfa(n);
prf("%I64d
",ans);
return 0;
}
//end-----------------------------------------------------------------------