Cod sursa(job #2049804)

Utilizator B_RazvanBaboiu Razvan B_Razvan Data 27 octombrie 2017 17:40:04
Problema Amenzi Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.55 kb
#include <iostream>
#include <cstdio>
#include <vector>
#define NMAX 155
#define INF 0x3f3f3f

using namespace std;

int n, m, k, p, amenzi[NMAX][3505], dp[NMAX][3505];
vector <pair <int, int> > g[NMAX];
vector <pair <int, int> >::iterator it;

void read()
{
    scanf("%d%d%d%d", &n, &m, &k, &p);

    for(int i=1; i<=m; ++i)
    {
        int x, y, c;
        scanf("%d%d%d", &x, &y, &c);
        g[x].push_back(make_pair(y, c));
        g[y].push_back(make_pair(x, c));
    }
    for(int i=1; i<=k; ++i)
    {
        int node, time, c;
        scanf("%d%d%d", &node, &time, &c);
        amenzi[node][time] = c;
    }

    for(int i=1; i<=n; ++i)
        for(int j=0; j<=3500; ++j)
            dp[i][j] = -INF;
    dp[1][0] = 0;
}

void solveDPMatrix()
{
    for(int time = 1; time <= 3500; ++time)
    {
        for(int i=1; i<=n; ++i)
        {
            for(it = g[i].begin(); it != g[i].end(); ++it)
                if(time - it->second >= 0 && dp[i][time] < dp[it->first][time - it->second])
                    dp[i][time] = dp[it->first][time - it->second];

            dp[i][time] = max(dp[i][time], dp[i][time - 1]);

            if(dp[i][time] != -INF)
                dp[i][time] += amenzi[i][time];
        }
    }
}

int main()
{
    freopen("amenzi.in", "r", stdin);
    freopen("amenzi.out", "w", stdout);
    read();
    solveDPMatrix();
    for(int i=1; i<=p; ++i)
    {
        int node, time;
        scanf("%d%d", &node, &time);
        printf("%d\n", dp[node][time]);
    }
    return 0;
}