Cod sursa(job #2236803)

Utilizator giotoPopescu Ioan gioto Data 30 august 2018 16:17:29
Problema Amenzi Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.6 kb
#include <bits/stdc++.h>
using namespace std;

int n, m, k, p;
int d[3505][155];
int am[3505][155];

vector <pair <int, int> > v[155];

inline void wutm8(){
    for(int j = 0; j <= 3500 ; ++j)
        for(int i = 1; i <= n ; ++i)
            d[j][i] = -2000000000;

    d[0][1] = am[0][1];

    for(int timp = 0; timp < 3500 ; ++timp){
        for(int nod = 1; nod <= n ; ++nod){
            if(timp > 0){
                if(d[timp - 1][nod] >= 0) d[timp][nod] = max(d[timp][nod], d[timp - 1][nod] + am[timp][nod]);
                if(d[timp][nod] == d[timp - 1][nod]) continue ;
            }
            if(d[timp][nod] < 0) continue ;
            for(auto it : v[nod]){
                if(timp + it.second > 3500) continue ;
                d[timp + it.second][it.first] = max(d[timp + it.second - 1][it.first] + am[timp + it.second][it.first], d[timp + it.second][it.first]);
                d[timp + it.second][it.first] = max(d[timp + it.second][it.first], d[timp][nod] + am[timp + it.second][it.first]);
            }
        }
    }
}
int main()
{
    freopen("amenzi.in", "r", stdin);
    freopen("amenzi.out", "w", stdout);

    scanf("%d%d%d%d", &n, &m, &k, &p);
    int x, y, c;
    for(int i = 1; i <= m ; ++i){
        scanf("%d%d%d", &x, &y, &c);
        v[x].push_back({y, c});
        v[y].push_back({x, c});
    }
    for(int i = 1; i <= k ; ++i){
        scanf("%d%d%d", &x, &y, &c);
        am[y][x] += c;
    }

    wutm8();

    for(int i = 1; i <= p ; ++i){
        scanf("%d%d", &x, &y);
        printf("%d\n", max(d[y][x], -1));
    }

    return 0;
}