Cod sursa(job #1051775)

Utilizator FlameingoAiordachioaei Marius Flameingo Data 10 decembrie 2013 16:31:16
Problema Amenzi Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.56 kb
#include <cstdio>
#include <vector>
#include <algorithm>
#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[TMAX];
int D[TMAX][NMAX], A[TMAX][NMAX], R[PMAX];

/// @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;
    scanf ("%d%d%d%d", &N, &M, &K, &P);
    for (i = 1; i <= M; ++i) {
        scanf ("%d%d%d", &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) {
        scanf ("%d%d%d", &a, &b, &c);
        A[b][a] = c;
    }
    for (i = 1; i <= P; ++i) {
        scanf ("%d%d", &a, &b);
        I[b] = make_pair (a, i);
    }
    for (i = 0; i < TMAX; ++i)
        for (j = 1; j <= N; ++j)
            D[i][j] = -1;
    D[0][1] = 0;
    for (i = 1; i < TMAX; ++i) {
        for (j = 1; j <= N; ++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)
                continue;
            D[i][j] += A[i][j];
        }
        if (I[i].node)
            R[I[i].cost] = D[i][I[i].node];
    }
    for (i = 1; i <= P; ++i)
        printf ("%d\n", R[i]);

}