CF 182DIV2 D Yaroslav and Time
Link:http://codeforces.com/contest/302/problem/D
题意:一个图, 从p1到p2, 需要花费 d·( |xi - xj| + |yi - yj) 时间, 每到一个点将获得时间奖励, 求起点到终点的所需具备的最少时间。
解:存在负边的最短路, 思路暂时想到FLYOD, 将一条边的花费减去该点的奖励作为本边的权值。
#include <iostream> #include <fstream> #include <string> #include <map> #include <cstring> #include <cstdlib> #include<queue> #include <algorithm> using namespace std; int a[120]; long long n, d, mm[120][120]; struct point{ int x, y; }; int dist(point a, point b){ return (abs(a.x - b.x) + abs(a.y - b.y)); } int main(){ while(cin >> n >> d){ point p[120]; for(int i = 0; i < n-2; i++){ cin >> a[i+1]; } for(int i = 0; i < n; i++){ scanf("%d %d", &p[i].x, &p[i].y); } for(int i = 0; i < n; i++){ for(int j = 0; j < n; j++){ if(i!=j)mm[i][j] = d*dist(p[i],p[j]) - a[i]; } } for(int k = 0; k < n; k++){ for(int i = 0; i < n; i++){ for(int j = 0; j < n; j++){ mm[i][j] = min(mm[i][j],mm[i][k] + mm[k][j]); } } } cout << mm[0][n-1]<<endl; } }