Pagini recente » Cod sursa (job #1391097) | Cod sursa (job #446597) | Cod sursa (job #1559667) | Cod sursa (job #2519396) | Cod sursa (job #552800)
Cod sursa(job #552800)
#include <cstdio>
#include <list>
using namespace std;
#define NMAX 152
#define PMAX 8005
#define TMAX 3505
struct query {
int x, y;
} Q[PMAX];
int A[NMAX][TMAX], S[NMAX][TMAX], tmax, n, m, k, p, i, j, h, x, y, c;
list < pair <int, int> > G[NMAX];
list < pair <int, int> >::iterator it;
int main () {
freopen ("amenzi.in", "r", stdin);
freopen ("amenzi.out", "w", stdout);
scanf ("%d %d %d %d", &n, &m, &k, &p);
for (i = 1; i <= m; i++) {
scanf ("%d %d %d", &x, &y, &c);
G[x].push_back (make_pair (y, c));
G[y].push_back (make_pair (x, c));
}
for (i = 1; i <= k; i++) {
scanf ("%d %d %d", &x, &y, &c);
A[x][y] += c;
}
for (i = 1; i <= p; i++) {
scanf ("%d %d", &x, &y);
Q[i].x = x, Q[i].y = y;
if (y > tmax) tmax = y;
}
memset (S, -1, sizeof (S));
S[1][0] = A[1][0];
for (j = 0; j <= tmax; j++)
for (i = 1; i <= n; i++) {
if (j > 0) S[i][j] = S[i][j-1];
for (it = G[i].begin (); it != G[i].end (); it++) {
h = it -> first, c = it -> second;
if (j - c >= 0) S[i][j] = max (S[i][j], S[h][j - c]);
}
if (S[i][j] != -1 && A[i][j]) {
if (S[i][j] == -1) S[i][j] = A[i][j];
else S[i][j] += A[i][j];
}
}
for (i = 1; i <= p; i++)
printf ("%d\n", S[ Q[i].x ][ Q[i].y ]);
return 0;
}