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

  

posted @ 2013-05-07 19:19  Shamaoer  阅读(238)  评论(2)    收藏  举报