Pagini recente » Cod sursa (job #198806) | Cod sursa (job #546668) | Cod sursa (job #2355214) | Cod sursa (job #1312553) | Cod sursa (job #3275416)
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
ifstream fin("amenzi.in");
ofstream fout("amenzi.out");
const int maxn = 150;
const int maxt = 3500;
vector<pair<int,int>> adj[maxn + 1];
long long amenda[maxn + 1][maxt + 1];
int visited[maxn + 1][maxt + 1];
long long dp[maxn + 1][maxt + 1];
int main() {
int n, m, k, p;
fin >> n >> m >> k >> p;
for (int i = 0; i < m; i++) {
int a, b, c;
fin >> a >> b >> c;
adj[a].push_back({b, c});
adj[b].push_back({a, c});
}
for (int i = 0; i < k; i++) {
int a, b, c;
fin >> a >> b >> c;
amenda[a][b] += c;
}
vector<pair<int,int>> queries(p);
for (int i = 0; i < p; i++)
fin >> queries[i].first >> queries[i].second;
visited[1][0] = 1;
dp[1][0] = amenda[1][0];
for (int t = 0; t <= maxt; t++)
for (int i = 1; i <= n; i++)
for (auto j: adj[i]) {
int child = j.first;
int time = j.second;
if (t - time >= 0 && visited[child][t - time] == 1) {
visited[i][t] = 1;
dp[i][t] = max(dp[i][t], dp[child][t - time] + amenda[i][t]);
}
if (t - 1 >= 0 && visited[child][t - 1] == 1) {
// visited[i][t] = 1;
dp[i][t] = max(dp[i][t], dp[i][t - 1]);
}
}
for (auto q: queries)
if (visited[q.first][q.second] == 0)
fout << "-1\n";
else
fout << dp[q.first][q.second] << '\n';
return 0;
}