Pagini recente » Cod sursa (job #944093) | Cod sursa (job #1741830) | Cod sursa (job #2486248) | Cod sursa (job #295971) | Cod sursa (job #1504943)
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
#define x first
#define y second
#define INF 1 << 26
#define NMAX 152
#define MMAX 3502
using namespace std;
int n, m, k, p, x, y, a[NMAX][MMAX], Dp[NMAX][MMAX];
vector < pair < int, int > > v[NMAX];
int main(){
freopen("amenzi.in", "r", stdin);
freopen("amenzi.out", "w", stdout);
scanf("%d %d %d %d", &n, &m, &k, &p);
for(int i = 1; i <= m; ++i){
int A, B, C;
scanf("%d %d %d", &A, &B, &C);
v[A].push_back(make_pair(B, C));
v[B].push_back(make_pair(A, C));
}
for(int i = 1; i <= k; ++i){
int A, B, C;
scanf("%d %d %d", &A, &B, &C);
a[A][B] += C;
}
for(int i = 1; i <= n; ++i)
Dp[i][0] = -INF;
Dp[1][0] = a[1][0];
for(int j = 1; j < MMAX; ++j)
for(int i = 1; i <= n; ++i){
Dp[i][j] = Dp[i][j - 1] + a[i][j];
for(vector < pair < int, int > > :: iterator it = v[i].begin(); it != v[i].end(); ++it)
if (it->y <= j && Dp[i][j] < Dp[it->x][j - it->y] + a[i][j])
Dp[i][j] = Dp[it->x][j - it->y] + a[i][j];
}
for(int i = 1; i <= p; ++i){
int A, B;
scanf("%d %d", &A, &B);
if (Dp[A][B] < 0)
printf("-1\n");
else
printf("%d\n", Dp[A][B]);
}
return 0;
}