Pagini recente » Cod sursa (job #2164285) | Cod sursa (job #136258) | Cod sursa (job #1641847) | Cod sursa (job #2248477) | Cod sursa (job #10935)
Cod sursa(job #10935)
#include <cstdio>
#include <cstdlib>
#include <ctime>
using namespace std;
const char iname[] = "amenzi.in";
const char oname[] = "amenzi.out";
#define MAX_N 151
#define MAX_T 3501
int G[MAX_N][MAX_N], D[MAX_N][MAX_N], deg[MAX_N];
int A[MAX_T][MAX_N];
int R[MAX_T][MAX_N], in[MAX_T][MAX_N];
int solve(int T, int X, int n)
{
if ((T == 0) && (X == 1)) {
R[T][X] = 0;
in[T][X] = 1;
}
if (in[T][X])
return R[T][X];
R[T][X] = -1;
if (T > 0)
R[T][X] = solve(T - 1, X, n);
for (int i = 0; i < deg[X]; ++i) {
int Y = G[X][i];
int C = D[X][i];
if (T >= C) {
solve(T - C, Y, n);
if (R[T][X] < R[T - C][Y])
R[T][X] = R[T - C][Y];
}
}
if (R[T][X] != -1)
R[T][X] += A[T][X];
in[T][X] = 1;
return R[T][X];
}
int main(void)
{
freopen(iname, "r", stdin);
int N, M;
int K, P;
int X, Y, C, T;
scanf("%d %d %d %d", &N, &M, &K, &P);
for (int i = 0; i < M; ++i) {
scanf("%d %d %d", &X, &Y, &C);
G[X][deg[X]] = Y, D[X][deg[X]] = C;
deg[X] ++;
G[Y][deg[Y]] = X, D[Y][deg[Y]] = C;
deg[Y] ++;
}
for (int i = 0; i < K; ++i) {
scanf("%d %d %d", &X, &T, &C);
A[T][X] += C;
}
for (T = 0; T < MAX_T; ++T)
for (X = 1; X <= N; ++X)
solve(T, X, N);
freopen(oname, "w", stdout);
for (int i = 0; i < P; ++i) {
scanf("%d %d", &X, &T);
printf("%d\n", R[T][X]);
}
return 0;
}