Pagini recente » Cod sursa (job #1919107) | Cod sursa (job #2516965) | Cod sursa (job #781486) | Cod sursa (job #3199199) | Cod sursa (job #2343471)
#include <bits/stdc++.h>
int max(int x, int y) {
if (x > y) return x;
return y;
}
#define int_pair std::pair <int, int>
#define MAXN 155
#define MAXT 3505
int N, M, K, P;
int DP[2*MAXT][MAXN], Pay[2*MAXT][MAXN];
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 j=0, i; j<MAXN; ++j)
for (i=0; i<MAXT; ++i)
DP[i][j] = -1;
DP[0][1] = Pay[0][1];
for (int i=0, j; i+1<MAXT; ++i)
for (j=1; j<=N; ++j) if (DP[i][j] > -1) {
DP[i+1][j] = max(DP[i+1][j], DP[i][j] + Pay[i+1][j]);
for (int_pair Edge:ADC[j])
DP[i + Edge.second][Edge.first] = std::max(DP[i][j] + Pay[i + Edge.second][Edge.first], DP[i + Edge.second][Edge.first]);
}
}
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[t][a] += s;
}
void Rezolvare() {
Dynamic();
for (int i=0, x, y; i<P; ++i)
In >> x >> y, Out << DP[y][x] << '\n';
}
int main()
{
Citire();
Rezolvare();
return 0;
}