Cod sursa(job #22470)

Utilizator StTwisterKerekes Felix StTwister Data 26 februarie 2007 17:55:37
Problema Amenzi Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.75 kb
#include <stdio.h>
#include <string>

#define KMAX 12001
#define PMAX 8001
#define NMAX 151
#define MMAX 1500
#define TMAX 3501

int N, M, K, P;
int X[MMAX], Y[MMAX], C[MMAX];
int A[TMAX][NMAX];
int Am[TMAX][NMAX];
int tMax;

void solve()
{
    A[0][1] = 0;

    for (int t = 1; t<=TMAX; ++t)
    {
        for (int i = 0; i<M; ++i)
        {
            int src = X[i];
            int dest = Y[i];
            int cost = C[i];

            if (t-cost>=0 && A[t-cost][src] > A[t][dest])
            {
                A[t][dest] = A[t-cost][src];
            }

            if (A[t-1][dest] > A[t][dest])
            {
                A[t][dest] = A[t-1][dest];
            }

            src = Y[i];
            dest = X[i];

            if (t-cost>= 0 && A[t-cost][src] > A[t][dest])
            {
                A[t][dest] = A[t-cost][src];
            }

            if (A[t-1][dest] > A[t][dest])
            {
                A[t][dest] = A[t-1][dest];
            }
        }

        for (int i = 1; i<=N; ++i)
        {
            if (A[t][i] >= 0)
                A[t][i] += Am[t][i];
        }
        int a = t;
    }
}

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

    memset(A, 0xff, sizeof(A));

    scanf("%d %d %d %d", &N, &M, &K, &P);
    for (int i = 0; i<M; ++i)
    {
        scanf("%d %d %d", &X[i], &Y[i], &C[i]);
    }
    for (int i = 0; i<K; ++i)
    {
        int x,y,c;
        scanf("%d %d %d", &x, &y, &c);
        Am[y][x] = c;
        if (y>tMax)
            tMax = y;
    }

    solve();

    for (int i = 0; i<P; ++i)
    {
        int x,y;
        scanf("%d %d", &x, &y);
        printf("%d\n", A[y][x]);
    }

}