Cod sursa(job #603829)

Utilizator SpiderManSimoiu Robert SpiderMan Data 18 iulie 2011 18:42:57
Problema Amenzi Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.28 kb
# include <cstdio>
# include <vector>
using namespace std;

const char *FIN = "amenzi.in", *FOU = "amenzi.out";
const int MAX_N = 151, MAX_T = 3501;

int A[MAX_N][MAX_T], B[MAX_N][MAX_T];
vector < pair <int, int> > G[MAX_N];
int N, M, K, P;

int main (void) {
    freopen (FIN, "r", stdin);
    freopen (FOU, "w", stdout);

    scanf ("%d %d %d %d", &N, &M, &K, &P);
    for (int i = 1, a, b, c; 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 (int i = 1, a, b, c; i <= K; ++i) {
        scanf ("%d %d %d", &a, &b, &c);
        B[a][b] += c;
    }
    for (int i = 2; i <= N; ++i)
        A[i][0] = -1;
    for (int j = 1; j < MAX_T; ++j) {
        for (int i = 1; i <= N; ++i) {
            A[i][j] = A[i][j - 1];
            for (int k = 0, l = G[i].size (); k < l; ++k) {
                pair <int, int> ind = G[i][k];
                if (j >= ind.second && A[ind.first][j - ind.second] > A[i][j])
                    A[i][j] = A[ind.first][j - ind.second];
            }
            if (A[i][j] != -1) A[i][j] += B[i][j];
        }
    }
    for (int i = 1, a, b; i <= P; ++i) {
        scanf ("%d %d", &a, &b);
        printf ("%d\n", A[a][b]);
    }
}