Cod sursa(job #2017444)

Utilizator GoogalAbabei Daniel Googal Data 1 septembrie 2017 11:50:53
Problema Amenzi Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.07 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;
const int DIM = 1000000;

struct Points{
  int x;
  int y;
};

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

void read(int &no){
  no = 0;
  while(!isdigit(buff[pos])){
    if(++pos == DIM){
      in.read(buff, DIM);
      pos = 0;
    }
  }

  while(isdigit(buff[pos])){
    no = (no * 10) + (buff[pos] - '0');
    if(++pos == DIM){
      in.read(buff, DIM);
      pos = 0;
    }
  }
}

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 init() {
  //in >> n >> m >> k >> p;
  read(n);
  read(m);
  read(k);
  read(p);
  for(int i = 1; i <= m; i++) {
    int from, to, time;
    //in >> from >> to >> time;
    read(from);
    read(to);
    read(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;
    read(inters);
    read(tmp);
    read(val);
    c[inters][tmp] += val;
  }

  for(int i = 1; i <= p; i++) {
    int node, tmp;
    //in >> node >> tmp;
    read(node);
    read(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()
{
  init();
  computedp();
  write();

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