Cod sursa(job #9214)

Utilizator dominoMircea Pasoi domino Data 27 ianuarie 2007 03:36:39
Problema Amenzi Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.34 kb
#include <stdio.h>
#include <algorithm>
#include <vector>

using namespace std;

#define MAX_N 105
#define MAX_T 3505
#define INF 0x3f3f3f3f
#define FIN "amenzi.in"
#define FOUT "amenzi.out"
#define mp make_pair
#define pb push_back
#define f first
#define s second

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

int main(void)
{
    int i, j, a, b, c;
    vector< pair<int, int> >::iterator it; 

    freopen(FIN, "r", stdin);
    freopen(FOUT, "w", stdout);

    for (scanf("%d %d %d %d", &N, &M, &K, &P); M; M--)
    {
        scanf("%d %d %d", &a, &b, &c);
        a--, b--;
        G[a].pb(mp(b, c));
        G[b].pb(mp(a, c));
    }
    for (; K; K--)
    {
        scanf("%d %d %d", &a, &b, &c);
        tax[b][a-1] += c;
    }

    for (i = 0; i < MAX_T; i++)
        for (j = 0; j < N; j++)
            bst[i][j] = -INF;
    bst[0][0] = 0;

    for (i = 0; i+1 < MAX_T; i++)
        for (j = 0; j < N; j++)
        {
            bst[i+1][j] = max(bst[i+1][j], bst[i][j]);
            for (it = G[j].begin(); it != G[j].end(); it++)
                bst[i+it->s][it->f] = max(bst[i+it->s][it->f], bst[i][j]+tax[i+it->s][it->f]);
        }

    for (; P; P--)
    {
        scanf("%d %d", &a, &b);
        printf("%d\n", bst[b][a-1]);
    }

    return 0;
}