Cod sursa(job #1473446)

Utilizator theep0Cruceru Radu theep0 Data 19 august 2015 14:01:05
Problema Amenzi Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.56 kb
#include <iostream>
#include <cstdio>
#include <vector>
#define minusoo -0x3f3f3f3f

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];
vector<meet> meetings;

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

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