Cod sursa(job #1415187)

Utilizator blasterzMircea Dima blasterz Data 3 aprilie 2015 21:31:26
Problema Amenzi Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.26 kb
#include <cstdio>
#include <algorithm>

using namespace std;
#define N 151
#define T 3501

struct nod {
    int x, cost;
    nod *next;
};

nod *a[N];
int dp[T][N];
int cost[N][T];
int n, m, K, P;
inline void add(int p, int q, int c) {
    nod *u = new nod;
    u->x = q;
    u->cost = c;
    u->next = a[p];
    a[p] = u;
}

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

    scanf ("%d %d %d %d\n", &n, &m, &K, &P);
    int i, j, t, p, q, c;
    for (i = 1; i <= m; ++i) {
        scanf ("%d %d %d\n", &p, &q, &c);
        add(p, q, c);
        add(q, p, c);
    }

    for (i = 1; i <= K; ++i) {
        scanf ("%d %d %d\n", &p, &q, &c);
        cost[p][q] += c;
    }
    
    for (t = 0; t < T; ++t)
        for (j = 2; j <= n; ++j)
            dp[t][j] = -0x3f3f3f3f;

    for (t = 1; t < T; ++t)
        for (i = 1; i <= n; ++i) {
            dp[t][i] = dp[t - 1][i];
            for (nod *it = a[i]; it; it = it->next)
                if (t - it->cost >= 0)
                    dp[t][i] = max(dp[t][i], dp[t - it->cost][it->x]);
            if (dp[t][i] != -0x3f3f3f3f)
                dp[t][i] += cost[i][t];
        }
    

    for (i = 1; i <= P; ++i) {
        scanf ("%d %d\n", &q, &t);
        printf ("%d\n", dp[t][q]);
    }

}