Cod sursa(job #1567112)

Utilizator HashiraGrigore Vlad Hashira Data 12 ianuarie 2016 22:08:07
Problema Amenzi Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.3 kb
#include <fstream>

#include <vector>

int main()
{
    std::ifstream fin("amenzi.in");
    std::ofstream fout("amenzi.out");

    int n, m, k, p;

    fin >> n >> m >> k >> p;

    std::vector < std::vector < std::pair < int, int > > > adj_list(n + 1);

    for(int i = 1 ; i <= m ; ++i)
    {
        int u, v, c;

        fin >> u >> v >> c;

        adj_list[u].push_back(std::make_pair(v, c));
        adj_list[v].push_back(std::make_pair(u, c));
    }

    std::vector < std::vector < int > > amenda(3505, std::vector < int >(n + 1));

    for(int i = 1 ; i <= k ; ++i)
    {
        int l, o, c;

        fin >> l >> o >> c;
        amenda[o][l] += c;
    }

    std::vector < std::vector < int > > dp(3505, std::vector < int >(n + 1, -1));

    dp[0][1] = 0;

    for(int i = 1 ; i <= 3500 ; ++i)
        for(int j = 1 ; j <= n ; ++j)
    {
        for(auto& k : adj_list[j])
            if(i - k.second >= 0)
                dp[i][j] = std::max(dp[i][j], dp[i - k.second][k.first]);

        dp[i][j] = std::max(dp[i][j], dp[i - 1][j]);
        if(dp[i][j] >= 0)
            dp[i][j] += amenda[i][j];
    }

    for(int i = 1 ; i <= p ; ++i)
    {
        int inter, ora;

        fin >> inter >> ora;
        fout << dp[ora][inter] << "\n";
    }

    return 0;
}