Cod sursa(job #1473454)

Utilizator theep0Cruceru Radu theep0 Data 19 august 2015 14:11:27
Problema Amenzi Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.69 kb
#include <iostream>
#include <cstdio>
#include <vector>
#define minusoo -1
#define maxT 3500
#define dim 8192

char ax[dim];
int pz;
void cit(int &x) {
    x = 0;
    while (ax[pz] < '0' || ax[pz] > '9') {
        ++pz;
        if (pz == dim) fread(ax, 1, dim, stdin), pz = 0;
    }
    while (ax[pz] >= '0' && ax[pz] <= '9') {
        x = x * 10 + ax[pz++] - '0';
        if (pz == dim) fread(ax, 1, dim, stdin), pz = 0;
    }
}

using namespace std;

struct drum {
    int end, cost;
    drum () {};
    drum (int e, int c): end(e), cost(c) {};
};

struct meet {
    int n, t;
    meet () {};
    meet (int n, int t): n(n), t(t) {};
};

vector<drum> nodes[3501];

int N, M, K, P, i, m, j, s, e, c, t;
int dp[3501][151];
int cost[3501][151];

int main() {
    freopen("amenzi.in", "r", stdin);
    freopen("amenzi.out", "w", stdout);
    cit(N), cit(M), cit(K), cit(P);
    for (i = 1; i <= M; i++) {
        cit(s), cit(e), cit(c);
        nodes[s].push_back(drum(e, c));
        nodes[e].push_back(drum(s, c));
    }
    for (i = 1; i <= K; i++) {
        cit(s), cit(t), cit(c);
        cost[t][s] += c;
    }
    for (t = 0; t <= maxT; t++) {
        for (i = 2; i <= N; i++) {
            dp[t][i] = minusoo;
        }
    }
    for (t = 1; t <= maxT; t++) {
        for (i = 1; i <= N; i++) {
            dp[t][i] = dp[t - 1][i];
            for(vector<drum>::iterator it = nodes[i].begin(); it != nodes[i].end(); it++) {
                if ((*it).cost <= t) dp[t][i] = max(dp[t][i], dp[t - (*it).cost][(*it).end]);
            } 
            if (dp[t][i] != minusoo) 
                dp[t][i] += cost[t][i];
        }
    }
    for (i = 1; i <= P; i++) {
        cit(s), cit(t);
        printf("%d\n", dp[t][s]);
    }
}