Cod sursa(job #1414379)

Utilizator yololy97Olaru Bogdan-Ioan yololy97 Data 2 aprilie 2015 16:07:41
Problema Amenzi Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.34 kb
#include <cstdio>
#include <vector>
#include <algorithm>
#define N 151
#define timp 3501
using namespace std;
int m, n, k, p, amenda[N][timp], dp[timp][N];
vector< pair<int, int> > v[N];
int main(){
    freopen("amenzi.in", "r", stdin);
    freopen("amenzi.out", "w", stdout);
    scanf("%d %d %d %d\n", &n, &m, &k, &p);
    for(int i = 1; i <= m; ++i){
        int x, y, c;
        scanf("%d %d %d\n", &x, &y, &c);
        v[x].push_back(make_pair(y, c));
        v[y].push_back(make_pair(x, c));
    }
    for(int i = 1; i <= k; ++i){
        int x, y, c;
        scanf("%d %d %d\n", &x, &y, &c);
        amenda[x][y] = c;
    }
    for(int i = 0; i <= timp; ++i)
        for(int j = 1; j <= n; ++j)
            dp[i][j] = -1;
    dp[0][1] = amenda[1][0];
    for(int t = 0; t <= timp; ++t)
        for(int nod = 1; nod <= n; ++nod)
            if(dp[t][nod] >= 0){
                for(int i = 0; i < v[nod].size(); ++i){
                    dp[t + v[nod][i].second][v[nod][i].first] = max(dp[t + v[nod][i].second][v[nod][i].first], dp[t][nod] + amenda[v[nod][i].first][t + v[nod][i].second]);
                }
                dp[t + 1][nod] = max(dp[t][nod], dp[t + 1][nod]);
            }
    for(int i = 1; i <= p; ++i){
        int x, y;
        scanf("%d %d\n", &x, &y);
        printf("%d\n", dp[y][x]);
    }
    return 0;
}