Pagini recente » Cod sursa (job #1440877) | Cod sursa (job #1698619) | Cod sursa (job #2647783) | Cod sursa (job #2921828) | Cod sursa (job #1473446)
#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]);
}
}