Cod sursa(job #1072093)

Utilizator Mihai22eMihai Ionut Enache Mihai22e Data 3 ianuarie 2014 22:49:38
Problema Amenzi Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.36 kb
#include <fstream>
#include <queue>
#include <vector>
using namespace std;

const int MAX_N = 152;
const int MAX_T = 3502;
const int INF = 0x3f3f3f3f;

int N, M, K, P;
int C[MAX_N][MAX_N], D[MAX_T][MAX_N], fines[MAX_T][MAX_N];
vector < int > v[MAX_N];

int main() {
    ifstream f("amenzi.in");
    ofstream g("amenzi.out");

    f >> N >> M >> K >> P;
    for(int i = 1, x, y; i <= M; ++i) {
        f >> x >> y;
        f >> C[x][y];
        C[y][x] = C[x][y];
        v[x].push_back(y), v[y].push_back(x);
    }
    for(int i = 1, x, t, val; i <= K; ++i) {
        f >> x >> t >> val;
        fines[t][x] += val;
    }

    for(int t = 0; t < MAX_T; ++t)
        for(int i = 1; i <= N; ++i)
            D[t][i] = -INF;
    D[0][1] = 0;
    for(int t = 1; t < MAX_T; ++t)
        for(int i = 1; i <= N; ++i) {
            for(size_t j = 0; j < v[i].size(); ++j) {
                int x = v[i][j], t1;
                t1 = t - C[i][x];
                if(t1 < 0)
                    continue;
                D[t][i] = max(D[t][i], D[t1][x]);
            }
            D[t][i] = max(D[t][i], D[t - 1][i]);
            if(D[t][i] != -INF)
                D[t][i] += fines[t][i];
        }

    for(int i = 1, x, t; i <= P; ++i) {
        f >> x >> t;
        if(D[t][x] != -INF)
            g << D[t][x] << "\n";
        else g << 0 << "\n";
    }

    f.close();
    g.close();

    return 0;
}