Cod sursa(job #10586)

Utilizator filipbFilip Cristian Buruiana filipb Data 28 ianuarie 2007 18:33:36
Problema Amenzi Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.36 kb
#include <stdio.h>
#include <string.h>
#include <algorithm>
#include <vector>
#define max(a, b) ((a > b) ? a : b)
#define NMax 155

using namespace std;

int N, K, ND, T, C;
vector< pair<int, int> > G[NMax];
int A[3505][1505], D[3505][155];

int main(void)
{
    int i, j, c, M, P;
    vector< pair<int, int> >::iterator f;
    
    freopen("amenzi.in", "r", stdin);
    
    scanf("%d %d %d %d", &N, &M, &K, &P);
    for (; M; M--)
    {
        scanf("%d %d %d", &i, &j, &c);
        G[i].push_back(make_pair(j, c));
        G[j].push_back(make_pair(i, c));        
    }    
    
    for (i = 0; i < K; i++)
    {
        scanf("%d %d %d", &ND, &T, &C);
        A[T][ND] += C;
    }
        
    memset(D, -1, sizeof(D));
    
    D[0][1] = 0;
    for (j = 1; j <= 3500; j++)
        for (i = 1; i <= N; i++)
        {
            D[j][i] = D[j-1][i]; // asteptam in i
            
            for (f = G[i].begin(); f != G[i].end(); f++)
                if (j >= f->second)
                   D[j][i] = max(D[j][i], D[j-f->second][f->first]); 
                    
            if (D[j][i] != -1)            
            D[j][i] += A[j][i]; // incasam amenzile in nodul i, timpul j
        }

    for (; P; P--)
    {
        scanf("%d %d", &ND, &T);
        printf("%d\n", D[T][ND]);
    }
    
    for (;;);
    
    return 0;
}