Cod sursa(job #1553019)

Utilizator StarGold2Emanuel Nrx StarGold2 Data 19 decembrie 2015 01:35:25
Problema Amenzi Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.63 kb
#include <cstdio>
#include <algorithm>
#include <vector>

#define f first
#define s second
#define INF 2000000000
using namespace std;

int D[3501][151], A, B, C, N, M, K, P;
vector <pair <int, int> > E[151];
vector <int> L[3501][151];

int main () {

    freopen ("amenzi.in" ,"r", stdin );
    freopen ("amenzi.out","w", stdout);

    scanf ("%d %d %d %d", &N, &M, &K, &P);
    for (int i = 1; i <= M; i ++) {
        scanf ("%d %d %d", &A, &B, &C);

        E[A].push_back(make_pair(B, C));
        E[B].push_back(make_pair(A, C));
    }

    for (int i = 1; i <= K; i ++) {
        scanf ("%d %d %d", &A, &B, &C);

        L[B][A].push_back(C);
    }

    for (int t = 0; t <= 3500; t ++) {
        for (int i = 1; i <= N; i ++) {

            if (t == 0 && i == 1)
                D[t][i] = 0;
            else
                D[t][i] = -INF;

            if (t)
                D[t][i] = max (D[t][i], D[t-1][i]);

            vector <pair <int, int> > :: iterator it;
            for (it = E[i].begin(); it != E[i].end(); it ++) {
                pair <int, int> j = *it;

                if (t - j.s >= 0)
                    D[t][i] = max (D[t][i], D[t-j.s][j.f]);
            }

            vector <int> :: iterator it2;
            for (it2 = L[t][i].begin(); it2 != L[t][i].end(); it2 ++) {
                int j = *it2;

                D[t][i] += j;
            }
        }
    }

    for (int i = 1; i <= P; i ++) {
        scanf ("%d %d", &A, &B);

        if (D[B][A] < 0)
            printf ("-1\n");
        else
            printf ("%d\n", D[B][A]);
    }

    return 0;
}