Cod sursa(job #2343459)

Utilizator SqueekDanielTodasca Daniel SqueekDaniel Data 13 februarie 2019 23:40:56
Problema Amenzi Scor 30
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.3 kb
#include <bits/stdc++.h>

#define int_pair std::pair <int, int>
#define MAXN  155
#define MAXT 3505

int N, M, K, P;
int DP[MAXN][MAXT], Pay[MAXN][MAXT];
std::vector <int_pair> ADC[MAXN];

inline void AddEdge(int X, int Y, int W) {
    ADC[X].push_back({Y, W});
    ADC[Y].push_back({X, W});
}

void Dynamic() {
    for (int i=0, j; i<MAXN; ++i)
        for (j=0; j<MAXT; ++j)
            DP[i][j] = -1;

    DP[1][0] = Pay[1][0];
    for (int i=1, j; i<MAXT; ++i)
        for (j=1; j<=N; ++j) {
            if (DP[j][i-1] > -1)
                DP[j][i] = std::max(DP[j][i], DP[j][i-1] + Pay[j][i]);
            for (auto Edge:ADC[j])
                if (DP[Edge.first][i - Edge.second] > -1 && Edge.second <= i)
                    DP[j][i] = std::max(DP[j][i], DP[Edge.first][i - Edge.second] + Pay[j][i]);
        }
}

std::ifstream In ("amenzi.in");
std::ofstream Out("amenzi.out");

void Citire() {
    In >> N >> M >> K >> P;
    for (int i=0, x, y, w; i<M; ++i)
        In >> x >> y >> w, AddEdge(x, y, w);
    for (int i=0, a, t, s; i<K; ++i)
        In >> a >> t >> s, Pay[a][t] = s;
}

void Rezolvare() {
    Dynamic();
    for (int i=0, x, y; i<P; ++i)
        In >> x >> y, Out << DP[x][y] << '\n';
}

int main()
{
    Citire();
    Rezolvare();

    return 0;
}