Cod sursa(job #2241061)

Utilizator lucametehauDart Monkey lucametehau Data 14 septembrie 2018 18:23:23
Problema Amenzi Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.46 kb
#include <fstream>
#include <vector>

using namespace std;

ifstream cin ("amenzi.in");
ofstream cout ("amenzi.out");

const int INF = -2e9;
const int NMAX = 150;
const int TMAX = 3500;
typedef pair <int, int> pii;

int n, m, k, p, x, y, c;

vector <pii> g[1 + NMAX];
int v[1 + TMAX][1 + NMAX], dp[1 + TMAX][1 + NMAX];

void precalc() {
  for(int i = 0; i <= TMAX; i++) {
    for(int j = 1; j <= n; j++)
      dp[i][j] = INF;
  }
  dp[0][1] = v[0][1];
  for(int i = 0; i < TMAX; i++) {
    for(int j = 1; j <= n; j++) {
      if(i) {
        if(dp[i - 1][j] >= 0)
          dp[i][j] = max(dp[i][j], dp[i - 1][j] + v[i][j]);
        if(dp[i][j] == dp[i - 1][j])
          continue;
      }
      if(dp[i][j] < 0)
        continue;
      for(auto it : g[j]) {
        if(i + it.second > TMAX)
          continue;
        dp[i + it.second][it.first] = max(dp[i + it.second][it.first], dp[i + it.second - 1][it.first] + v[i + it.second][it.first]);
        dp[i + it.second][it.first] = max(dp[i + it.second][it.first], dp[i][j] + v[i + it.second][it.first]);
      }
    }
  }
}

int main() {
  cin >> n >> m >> k >> p;
  for(int i = 1; i <= m; i++) {
    cin >> x >> y >> c;
    g[x].push_back({y, c});
    g[y].push_back({x, c});
  }
  for(int i = 1; i <= k; i++) {
    cin >> x >> y >> c;
    v[y][x] += c;
  }
  precalc();
  for(int i = 1; i <= p; i++) {
    cin >> x >> y;
    cout << max(dp[y][x], -1) << "\n";
  }
  return 0;
}