Cod sursa(job #2766913)

Utilizator Alex_tz307Lorintz Alexandru Alex_tz307 Data 3 august 2021 20:07:17
Problema Amenzi Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.18 kb
#include <bits/stdc++.h>

using namespace std;

ifstream fin("amenzi.in");
ofstream fout("amenzi.out");

const int MAXN = 150;
const int MAXT = 3500;
vector<pair<int,int>> G[MAXN];
int add[1 + MAXT][MAXN], dp[1 + MAXT][MAXN];

void max_self(int &x, int y) {
  if (x < y)
    x = y;
}

int main() {
  int n, m, k, p;
  fin >> n >> m >> k >> p;
  for (int i = 0; i < m; ++i) {
    int u, v, w;
    fin >> u >> v >> w;
    --u, --v;
    G[u].emplace_back(v, w);
    G[v].emplace_back(u, w);
  }
  for (int i = 0; i < k; ++i) {
    int v, t, c;
    fin >> v >> t >> c;
    add[t][v - 1] += c;
  }
  for (int t = 0; t <= MAXT; ++t)
    for (int v = 0; v < n; ++v)
      dp[t][v] = -1;
  dp[0][0] = 0;
  for (int t = 1; t <= MAXT; ++t)
    for (int u = 0; u < n; ++u) {
      dp[t][u] = dp[t - 1][u];
      for (auto it : G[u]) {
        int v, w;
        tie(v, w) = it;
        if (t - w >= 0)
          max_self(dp[t][u], dp[t - w][v]);
      }
      if (dp[t][u] >= 0)
        dp[t][u] += add[t][u];
    }
  for (int i = 0; i < p; ++i) {
    int v, t;
    fin >> v >> t;
    fout << dp[t][v - 1] << '\n';
  }
  fin.close();
  fout.close();
  return 0;
}