Cod sursa(job #2236795)

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

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

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

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

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

    for(int timp = 0; timp < 3500 ; ++timp){
        for(int nod = 1; nod <= n ; ++nod){
            if(d[nod][timp] == -2000000000) continue ;
            if(timp > 0){
                if(d[nod][timp] == d[nod][timp - 1]) continue ;
                d[nod][timp] = max(d[nod][timp], d[nod][timp - 1] + am[nod][timp]);
            }
            for(auto it : v[nod]){
                if(timp + it.second > 3500) continue ;
                d[it.first][timp + it.second] = max(d[it.first][timp + it.second - 1] + am[it.first][timp + it.second], d[it.first][timp + it.second]);
                if(d[it.first][timp + it.second] < d[nod][timp] + am[it.first][timp + it.second])
                    d[it.first][timp + it.second] = d[nod][timp] + am[it.first][timp + it.second];
            }
        }
    }
}
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[x][y] += c;
    }

    wutm8();

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

    return 0;
}