Cod sursa(job #1608987)

Utilizator dariusdariusMarian Darius dariusdarius Data 22 februarie 2016 15:12:55
Problema Amenzi Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.46 kb
#include <algorithm>
#include <fstream>
#include <iostream>
#include <vector>
using namespace std;
const int MAX_N = 156;
const int MAX_K = 12005;

int cost[MAX_N][MAX_N];
vector< pair<int, int> > taxes[MAX_N];
int dp[MAX_K];

struct Tax {
    int time, place, value;
    inline bool operator < (const Tax &other) const {
        return time < other.time;
    }

} tax[MAX_K];

int best[MAX_N][3505];
int last_time[MAX_N];

int main() {
    ifstream fin("amenzi.in");
    ofstream fout("amenzi.out");
    int n, m, k, p, a, b, c;
    fin >> n >> m >> k >> p;
    for (int i = 1; i <= n; ++ i) {
        for (int j = 1; j <= n; ++ j) {
            cost[i][j] = 1 << 29;
        }
        cost[i][i] = 0;
    }
    for (int i = 1; i <= m; ++ i) {
        fin >> a >> b >> c;
        cost[a][b] = min(cost[a][b], c);
        cost[b][a] = min(cost[b][a], c);
    }
    for (int k = 1; k <= n; ++ k) {
        for (int i = 1; i <= n; ++ i) {
            for (int j = 1; j <= n; ++ j) {
                cost[i][j] = min(cost[i][j], cost[i][k] + cost[k][j]);
            }
        }
    }
    for (int i = 1; i <= k; ++ i) {
        fin >> tax[i].place >> tax[i].time >> tax[i].value;
    }
    sort(tax + 1, tax + k + 1);
    for (int i = 1; i <= k; ++ i) {
        if (cost[1][tax[i].place] > tax[i].time) {
            dp[i] = 0;
        } else {
            dp[i] = tax[i].value;
            for (int j = 1; j <= n; ++ j) {
                int time = tax[i].time;
                if (time > last_time[j]) {
                    time = last_time[j];
                }
                dp[i] = max(dp[i], best[j][time] + tax[i].value);
            }
        }
        for (int j = last_time[tax[i].place] + 1; j < tax[i].time; ++ j) {
            best[tax[i].place][j] = best[tax[i].place][j - 1];
        }
        best[tax[i].place][tax[i].time] = max(dp[i], best[tax[i].place][tax[i].time - 1]);
        last_time[tax[i].place] = tax[i].time;
    }
    int place, time, answer;
    for (int i = 1; i <= p; ++ i) {
        fin >> place >> time;
        if (cost[1][place] > time) {
            fout << "-1\n";
            continue;
        }
        answer = 0;
        for (int j = 1; j <= n; ++ j) {
            int last = time;
            if (last > last_time[j]) {
                last = last_time[j];
            }
            answer = max(answer, best[j][last]);
        }
        fout << answer << "\n";
    }
    return 0;
}