Cod sursa(job #2017443)

Utilizator GoogalAbabei Daniel Googal Data 1 septembrie 2017 11:47:36
Problema Amenzi Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.55 kb
#include <iostream>
#include <fstream>
#include <vector>

using namespace std;

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

const int NMAX = 150;
const int TMAX = 3500;
const int PMAX = 8000;

struct Points{
  int x;
  int y;
};

vector < Points > g[1 + NMAX];
Points a[1 + PMAX];
int n, m, k, p;
int dp[1 + NMAX][1 + TMAX];
int c[1 + NMAX][1 + TMAX];

void computedp() {
  for(int i = 0; i <= NMAX; i++)
    for(int j = 0; j <= TMAX; j++)
      dp[i][j] = -1;
  dp[1][0] = 0;
  for(int i = 1; i <= TMAX; i++) {
    for(int node = 1; node <= n; node++) {
      for(int j = 0; j < g[node].size(); j++) {
        Points from = g[node][j];
        if(0 <= i - from.y) {
          dp[node][i] = max(dp[node][i], dp[from.x][i - from.y]);
        }
      }
      dp[node][i] = max(dp[node][i], dp[node][i - 1]);
      if(0 <= dp[node][i])
        dp[node][i] += c[node][i];
    }
  }
}

void read() {
  in >> n >> m >> k >> p;
  for(int i = 1; i <= m; i++) {
    int from, to, time;
    in >> from >> to >> time;
    g[from].push_back({to, time});
    g[to].push_back({from, time});
  }

  for(int i= 1; i <= k; i++) {
    int inters, tmp, val;
    in >> inters >> tmp >> val;
    c[inters][tmp] += val;
  }

  for(int i = 1; i <= p; i++) {
    int node, tmp;
    in >> node >> tmp;
    a[i] = {node, tmp};
  }
}

void write() {
  for(int i = 1; i <= p; i++) {
    out << dp[a[i].x][a[i].y] << '\n';
  }
}

int main()
{
  read();
  computedp();
  write();

  in.close();
  out.close();
  return 0;
}