Pagini recente » Borderou de evaluare (job #1036657) | Cod sursa (job #2227014) | Cod sursa (job #154949) | Cod sursa (job #1357024) | Cod sursa (job #1051792)
#include <cstdio>
#include <vector>
#include <algorithm>
#define node first
#define cost second
using namespace std;
const int NMAX = 153, TMAX = 3503, PMAX = 8003;
vector <pair <int, int> > G[NMAX];
pair <int, int> I[TMAX];
int D[TMAX][NMAX], A[TMAX][NMAX], R[PMAX];
/// @var D[i][j] - amenzile maxim stranse la momentul i si aflandu-se in intersectia j
int main () {
freopen ("amenzi.in", "r", stdin);
freopen ("amenzi.out", "w", stdout);
vector <pair <int, int> > :: iterator k;
int N, M, K, P, a, b, c, i, j;
scanf ("%d%d%d%d", &N, &M, &K, &P);
for (i = 1; i <= M; ++i) {
scanf ("%d%d%d", &a, &b, &c);
G[a].push_back (make_pair (b, c));
G[b].push_back (make_pair (a, c));
}
for (i = 1; i <= K; ++i) {
scanf ("%d%d%d", &a, &b, &c);
A[b][a] = c;
}
for (i = 1; i <= P; ++i) {
scanf ("%d%d", &a, &b);
I[i] = make_pair (a, b);
}
for (i = 0; i < TMAX; ++i)
for (j = 1; j <= N; ++j)
D[i][j] = -1;
D[0][1] = A[0][1];
for (i = 1; i < TMAX; ++i)
for (j = 1; j <= N; ++j) {
D[i][j] = D[i - 1][j];
for (k = G[j].begin (); k != G[j].end (); ++k)
if (i >= k->cost && D[i - k->cost][k->node] != -1)
D[i][j] = max (D[i][j], D[i - k->cost][k->node]);
if (D[i][j] != -1)
D[i][j] += A[i][j];
}
for (i = 1; i <= P; ++i)
printf ("%d\n", D[I[i].cost][I[i].node]);
}