Cod sursa(job #1504943)

Utilizator paunmatei7FMI Paun Matei paunmatei7 Data 18 octombrie 2015 16:25:46
Problema Amenzi Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.39 kb
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>

#define x first
#define y second

#define INF 1 << 26

#define NMAX 152
#define MMAX 3502

using namespace std;

int n, m, k, p, x, y, a[NMAX][MMAX], Dp[NMAX][MMAX];
vector < pair < int, int > > v[NMAX];

int main(){
    freopen("amenzi.in", "r", stdin);
    freopen("amenzi.out", "w", stdout);
    scanf("%d %d %d %d", &n, &m, &k, &p);
    for(int i = 1; i <= m; ++i){
        int A, B, C;
        scanf("%d %d %d", &A, &B, &C);
        v[A].push_back(make_pair(B, C));
        v[B].push_back(make_pair(A, C));
    }
    for(int i = 1; i <= k; ++i){
        int A, B, C;
        scanf("%d %d %d", &A, &B, &C);
        a[A][B] += C;
    }
    for(int i = 1; i <= n; ++i)
        Dp[i][0] = -INF;
    Dp[1][0] = a[1][0];
    for(int j = 1; j < MMAX; ++j)
        for(int i = 1; i <= n; ++i){
            Dp[i][j] = Dp[i][j - 1] + a[i][j];
            for(vector < pair < int, int > > :: iterator it = v[i].begin(); it != v[i].end(); ++it)
                if (it->y <= j && Dp[i][j] < Dp[it->x][j - it->y] + a[i][j])
                    Dp[i][j] = Dp[it->x][j - it->y] + a[i][j];
        }
    for(int i = 1; i <= p; ++i){
        int A, B;
        scanf("%d %d", &A, &B);
        if (Dp[A][B] < 0)
            printf("-1\n");
        else
            printf("%d\n", Dp[A][B]);
    }
    return 0;
}