Cod sursa(job #2540948)

Utilizator MarianConstantinMarian Constantin MarianConstantin Data 7 februarie 2020 21:12:07
Problema Amenzi Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.32 kb
#include <bits/stdc++.h>
#define pb push_back

using namespace std;

const int MAXN = 155, MAXT = 3510;
ifstream fin("amenzi.in");
ofstream fout("amenzi.out");

int dp[MAXT][MAXN], tick[MAXT][MAXN], n, m, k, p;
vector<pair<int, int>> graph[MAXN];

void initialize()
{
    for (int i = 0; i < MAXT; ++i)
        for (int j = 0; j < MAXN; ++j)
            dp[i][j] = -1;
}

void read()
{
    fin >> n >> m >> k >> p;
    for (int i = 0; i < m; ++i) {
        int x, y, c;
        fin >> x >> y >> c;
        graph[x].pb({y, c});
        graph[y].pb({x, c});
    }
    for (int i = 0; i < k; ++i) {
        int x, y, val;
        fin >> x >> y >> val;
        tick[y][x] += val;
    }
}

void solve()
{
    dp[0][1] = 0;
    for (int i = 1; i < MAXT; ++i)
        for (int j = 1; j <= n; ++j) {
            dp[i][j] = dp[i - 1][j];
            for (const auto& it: graph[j])
                if (i - it.second >= 0)
                    dp[i][j] = max(dp[i][j], dp[i - it.second][it.first]);
            if (dp[i][j] >= 0)
                dp[i][j] += tick[i][j];
        }
}

void print()
{
    for (int i = 0; i < p; ++i) {
        int x, y;
        fin >> x >> y;
        fout << dp[y][x] << '\n';
    }
}

int main()
{   initialize();
    read();
    solve();
    print();
    return 0;
}