Cod sursa(job #1051806)

Utilizator FlameingoAiordachioaei Marius Flameingo Data 10 decembrie 2013 16:46:24
Problema Amenzi Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.51 kb
#include <cstdio>
#include <vector>
#include <algorithm>
#include <iostream>
#define node first
#define cost second
using namespace std;

const int NMAX = 153, TMAX = 3503, PMAX = 8003;

vector <pair <int, int> > G[NMAX];
pair <int, int> I[PMAX];
int D[TMAX][NMAX], A[TMAX][NMAX];

/// @var D[i][j] - amenzile maxim stranse la momentul i si aflandu-se in intersectia j

int main () {

    freopen ("amenzi.in", "r", stdin);
    freopen ("amenzi.out", "w", stdout);
    vector <pair <int, int> > :: iterator k;
    int N, M, K, P, a, b, c, i, j;
    cin >> N >> M >> K >> P;
    for (i = 1; i <= M; ++i) {
        cin >> a >> b >> c;
        G[a].push_back (make_pair (b, c));
        G[b].push_back (make_pair (a, c));
    }
    for (i = 1; i <= K; ++i) {
        cin >> a >> b >> c;
        A[b][a] += c;
    }
    for (i = 1; i <= P; ++i) {
        cin >> a >> b;
        I[i] = make_pair (a, b);
    }
    for (i = 0; i < TMAX; ++i)
        for (j = 1; j <= N; ++j)
            D[i][j] = -1;
    D[0][1] = A[0][1];
    for (i = 1; i <= TMAX - 3; ++i)
        for (j = 1; j <= N; ++j) {
            D[i][j] = max (D[i - 1][j], D[i][j]);
            for (k = G[j].begin (); k != G[j].end (); ++k)
                if (i >= k->cost && D[i - k->cost][k->node] != -1)
                    D[i][j] = max (D[i][j], D[i - k->cost][k->node]);
            if (D[i][j] != -1)
                D[i][j] += A[i][j];
        }
    for (i = 1; i <= P; ++i)
        printf ("%d\n", D[I[i].cost][I[i].node]);

}