Cod sursa(job #3219276)

Utilizator dobreraduDobre Radu Fabian dobreradu Data 30 martie 2024 16:38:04
Problema Amenzi Scor 70
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.34 kb
#include <bits/stdc++.h>

using namespace std;
ifstream in("amenzi.in");
ofstream out("amenzi.out");
const int NMAX = 155;
const int TIMPMAX = 3505;

int dp[NMAX][TIMPMAX], crime[NMAX][TIMPMAX];
int n, m, k, p;
struct HeapNode{
    int next, cost;
};
vector <HeapNode> g[NMAX];
void precal_dp(){
    for( int timp = 0; timp < TIMPMAX; timp++ )
        for( int i = 1; i <= n; i++ )
            dp[i][timp] = -1;
    dp[1][0] = 0;
    for( int timp = 1; timp < TIMPMAX; timp++ ){
        for( int i = 1; i <= n; i++ ){
            for( auto vecin : g[i] )
                if( timp >= vecin.cost )
                    dp[i][timp] = max( dp[i][timp], dp[vecin.next][timp - vecin.cost]);
            if( dp[i][timp] != -1 )
                dp[i][timp] = max( dp[i][timp], dp[i][timp-1] ) + crime[i][timp];
        }
    }
}
int main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(0); cout.tie(0);
    in >> n >> m >> k >> p;
    for( int i = 0; i < m; i++ ){
        int a, b, c;
        in >> a >> b >> c;
        g[a].push_back({b, c});
        g[b].push_back({a, c});
    }
    for( int i = 0; i < k; i++ ){
        int a, b, c;
        in >> a >> b >> c;
        crime[a][b] += c;
    }
    precal_dp();
    while( p-- ){
        int a, b;
        in >> a >> b;
        out << dp[a][b] << "\n";
    }
    return 0;
}