Cod sursa(job #1666240)

Utilizator DrumeaVDrumea Vasile DrumeaV Data 27 martie 2016 20:05:05
Problema Amenzi Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.24 kb
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>

#define pii pair< int, int >
#define st first
#define nd second

using namespace std;

const int Mn = 160;
const int Mt = 3600;

int n, m, k, p;
int dp[Mn][Mt], ar[Mn][Mt];
vector< pii > g[Mn];

int main()
{
    freopen("amenzi.in", "r", stdin);
    freopen("amenzi.out", "w", stdout);

    scanf("%d %d %d %d", &n, &m, &k, &p);
    for (; m; m--)
    {
        int a, b, c;
        scanf("%d %d %d", &a, &b, &c);
        g[a].push_back(pii(b, c));
        g[b].push_back(pii(a, c));
    }

    for (; k; k--)
    {
        int a, b, c;
        scanf("%d %d %d", &a, &b, &c);
        ar[a][b] += c;
    }

    memset(dp, -1, sizeof(dp));
    dp[1][0] = ar[1][0];
    for (int i = 1; i < Mt; i++)
        for (int j = 1; j <= n; j++)
        {
            dp[j][i] = dp[j][i - 1];
            for (auto it : g[j])
                if (i >= it.nd)
                   dp[j][i] = max(dp[j][i], dp[it.st][i - it.nd]);

            if (dp[j][i] != -1)
               dp[j][i] += ar[j][i];
        }

    for (; p; p--)
    {
        int a, b;
        scanf("%d %d", &a, &b);
        printf("%d\n", dp[a][b]);
    }

  return 0;
}