Pagini recente » Cod sursa (job #2216455) | Cod sursa (job #2590885) | Cod sursa (job #16606) | Cod sursa (job #3001092) | Cod sursa (job #3139828)
#include <bits/stdc++.h>
#define ll long long
#define ull unsigned long long
#define dl double
#define st first
#define nd second
#define II pair <int, int>
using namespace std;
const int N = 3501;
const int inf = 7 + 1e9;
vector <vector <II>> adj;
vector <vector <int>> cost, f, mi;
int main() {
#define TASKNAME "amenzi"
ios_base :: sync_with_stdio (0);
cin.tie (0);
if ( fopen( TASKNAME".inp", "r" ) ) {
freopen (TASKNAME".inp", "r", stdin);
freopen (TASKNAME".out", "w", stdout);
}
int n, m, k, q;
cin >> n >> m >> k >> q;
adj.resize(n + 1);
mi.assign(n + 1, vector <int> (n + 1, inf));
for (int i = 1; i <= m; i ++) {
int u, v, w;
cin >> u >> v >> w;
mi[u][v] = w;
mi[v][u] = w;
adj[u].push_back({v, w});
adj[v].push_back({u, w});
}
for (int k_ = 1; k_ <= n; k_ ++)
for (int i = 1; i <= n; i ++)
for (int j = 1; j <= n; j ++)
mi[i][j] = min(mi[i][j], mi[i][k_] + mi[k_][j]);
cost.assign(n + 1, vector <int> (N, 0));
for (int i = 1; i <= k; i ++) {
int u, t, c;
cin >> u >> t >> c;
cost[u][t] += c;
}
f.assign(n + 1, vector <int> (N, -inf));
f[1][0] = 0;
for (int time = 0; time < N; time ++)
for (int u = 1; u <= n; u ++) {
f[u][time] = max(f[u][time], (time > 0 ? f[u][time - 1] : -inf)) + cost[u][time];
for (auto z : adj[u])
if (time + z.nd < N)
f[z.st][time + z.nd] = max(f[z.st][time + z.nd], f[u][time]);
}
while (q --) {
int u, t;
cin >> u >> t;
if (mi[1][u] > t)
cout << "-1\n";
else
cout << f[u][t] << '\n';
}
return 0;
}