Pagini recente » Cod sursa (job #1414570) | Monitorul de evaluare | Cod sursa (job #2669169) | Cod sursa (job #2709616) | Cod sursa (job #1502267)
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
#define maxC 120000002
#define pb push_back
#define mp make_pair
#define f first
#define s second
#define maxN 152
#define maxT 3502
using namespace std;
int n, m, k, p, x, y, i, j, cost[maxN][maxT], dp[maxN][maxT];
vector < pair < int, int > > V[maxN];
void read()
{
int a, b, c;
freopen("amenzi.in", "r", stdin);
scanf("%d %d %d %d", &n, &m, &k, &p);
while (m --)
{
scanf("%d %d %d", &a, &b, &c);
V[a].pb(mp(b, c));
V[b].pb(mp(a, c));
}
for (i = 1; i <= k; ++ i)
{
scanf("%d %d %d", &a, &b, &c);
cost[a][b] += c;
}
}
void solve()
{
int node, time;
for (i = 1; i <= n; ++ i)
dp[i][0] = -maxC;
dp[1][0] = cost[1][0];
for (j = 1; j < maxT; ++ j)
for (i = 1; i <= n; ++ i)
{
dp[i][j] = dp[i][j - 1] + cost[i][j];
int l = V[i].size();
for (k = 0; k < l; ++ k)
{
node = V[i][k].f;
time = V[i][k].s;
if (time <= j && dp[i][j] < dp[node][j - time] + cost[i][j])
dp[i][j] = dp[node][j - time] + cost[i][j];
}
}
}
void write()
{
freopen("amenzi.out", "w", stdout);
while (p --)
{
scanf("%d %d", &x, &y);
if (dp[x][y] < 0)
printf("-1\n");
else
printf("%d\n", dp[x][y]);
}
}
int main()
{
read();
solve();
write();
return 0;
}