Cod sursa(job #1343167)

Utilizator AlexandruValeanuAlexandru Valeanu AlexandruValeanu Data 14 februarie 2015 23:07:21
Problema Amenzi Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.64 kb
#include <bits/stdc++.h>

using namespace std;

const int Tmax = 3500;
const int Nmax = 150;
const int Mmax = 1500;

struct Edge
{
    int nod;
    int cost;
    int urm;
};

Edge G[2 * Mmax + 1];
int contor;
int head[Nmax + 1];

int dp[Tmax + 1][Nmax + 1];
int ticket[Tmax + 1][Nmax + 1];

int N, M, K, P;

void addEdge(int x, int y, int c)
{
    contor++;
    G[contor].nod = y;
    G[contor].cost = c;
    G[contor].urm = head[x];
    head[x] = contor;
}

int main()
{
    ifstream in("amenzi.in");
    ofstream out("amenzi.out");

    ios_base::sync_with_stdio(false);

    in >> N >> M >> K >> P;

    for ( int i = 1; i <= M; ++i )
    {
        int a, b, c;
        in >> a >> b >> c;

        addEdge(a, b, c);
        addEdge(b, a, c);
    }

    for ( int i = 1; i <= K; ++i )
    {
        int a, b, c;
        in >> a >> b >> c;

        ticket[b][a] += c;
    }

    for ( int i = 0; i <= Tmax; ++i )
        for ( int j = 0; j <= Nmax; ++j )
            dp[i][j] = -2e9;

    dp[0][1] = ticket[0][1];

    for ( int t = 1; t <= Tmax; ++t )
    {
        for ( int nod = 1; nod <= N; ++nod )
        {
            dp[t][nod] = dp[t - 1][nod] + ticket[t][nod];

            for ( int p = head[nod]; p != 0; p = G[p].urm )
            {
                int fiu = G[p].nod;
                int cost = G[p].cost;

                if ( t >= cost )
                    dp[t][nod] = max(dp[t][nod], dp[t - cost][fiu] + ticket[t][nod]);
            }
        }
    }

    for ( int i = 1; i <= P; ++i )
    {
        int a, b;
        in >> a >> b;

        if ( dp[b][a] >= 0 )
            out << dp[b][a] << "\n";
        else
            out << "-1\n";
    }

    return 0;
}