Pagini recente » Cod sursa (job #2337103) | Cod sursa (job #2348882) | Cod sursa (job #2935585) | Cod sursa (job #2196713) | Cod sursa (job #2343459)
#include <bits/stdc++.h>
#define int_pair std::pair <int, int>
#define MAXN 155
#define MAXT 3505
int N, M, K, P;
int DP[MAXN][MAXT], Pay[MAXN][MAXT];
std::vector <int_pair> ADC[MAXN];
inline void AddEdge(int X, int Y, int W) {
ADC[X].push_back({Y, W});
ADC[Y].push_back({X, W});
}
void Dynamic() {
for (int i=0, j; i<MAXN; ++i)
for (j=0; j<MAXT; ++j)
DP[i][j] = -1;
DP[1][0] = Pay[1][0];
for (int i=1, j; i<MAXT; ++i)
for (j=1; j<=N; ++j) {
if (DP[j][i-1] > -1)
DP[j][i] = std::max(DP[j][i], DP[j][i-1] + Pay[j][i]);
for (auto Edge:ADC[j])
if (DP[Edge.first][i - Edge.second] > -1 && Edge.second <= i)
DP[j][i] = std::max(DP[j][i], DP[Edge.first][i - Edge.second] + Pay[j][i]);
}
}
std::ifstream In ("amenzi.in");
std::ofstream Out("amenzi.out");
void Citire() {
In >> N >> M >> K >> P;
for (int i=0, x, y, w; i<M; ++i)
In >> x >> y >> w, AddEdge(x, y, w);
for (int i=0, a, t, s; i<K; ++i)
In >> a >> t >> s, Pay[a][t] = s;
}
void Rezolvare() {
Dynamic();
for (int i=0, x, y; i<P; ++i)
In >> x >> y, Out << DP[x][y] << '\n';
}
int main()
{
Citire();
Rezolvare();
return 0;
}