Cod sursa(job #764301)

Utilizator informatician28Andrei Dinu informatician28 Data 4 iulie 2012 18:17:09
Problema Amenzi Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.4 kb
#include <fstream>
#include <vector>
#include <cstring>
#define MAX_T 3501
#define MAX_N 151
#define pb push_back

using namespace std;

ifstream in("amenzi.in");
ofstream out("amenzi.out");

int N, M, K, P, best[MAX_T][MAX_N], amenda[MAX_T][MAX_N];
vector< pair< int, int > >G[MAX_N];

int main()
{
    int i, j, x, y, t, fiu;

    in >> N >> M >> K >> P;
    for (i = 1; i <= M; i++)
    {
        in >> x >> y >> t;
        G[x].pb(make_pair(y,t));
        G[y].pb(make_pair(x,t));
    }
    for (i = 1; i <= K; i++)
    {
        in >> x >> y >> t;
        amenda[y][x] += t;
    }
    memset(best, 0xff, sizeof(best));
    best[0][1] = 0;
    for (i = 1; i <= 3500; i++)
    {
        for (j = 1; j <= N; j++)
        {
            best[i][j] = max(best[i][j], best[i-1][j]);
            vector< pair< int, int > > ::iterator it;
            for (it = G[j].begin(); it != G[j].end(); ++it)
            {
                t = it -> second;
                fiu = it -> first;
                if ( i >= t && best[i-t][fiu] > best[i][j])
                {
                    best[i][j] = best[i-t][fiu];
                }
            }
            if (best[i][j] != -1)
            {
                best[i][j] += amenda[i][j];
            }
        }
    }
    for (i = 1; i <= P; i++)
    {
        in >> x >> t;
        out << best[t][x] << '\n';
    }
    return 0;
}