Cod sursa(job #10189)

Utilizator astronomyAirinei Adrian astronomy Data 27 ianuarie 2007 23:07:34
Problema Amenzi Scor 100
Compilator c Status done
Runda Arhiva de probleme Marime 1.44 kb
#include <stdio.h>

#define MAX_N 165
#define T_MAX 3670
#define MAX_M 1600
#define max(a,b) ((a) > (b) ? (a) : (b))

int N, M, K, P, sum[T_MAX][MAX_N], A[T_MAX][MAX_N];
int G[MAX_N][MAX_M], D[MAX_N][MAX_M];

void add_edge(int u, int v, int c)
{
    G[u][++G[u][0]] = v, D[u][G[u][0]] = c;
    G[v][++G[v][0]] = u, D[v][G[v][0]] = c;
}

void solve(void)
{
    int i, t, j, k, v, c, r;

    for(i = 1; i <= N; i++)
        A[0][i] = -1;

    A[0][1] = sum[0][1];

    for(t = 1; t <= 3500; t++)
     for(i = 1; i <= N; i++)
     {
        r = -1;
        if(A[t-1][i] != -1)
            r = A[t-1][i]+sum[t][i];
        for(j = 1; j <= G[i][0]; j++)
        {
            v = G[i][j], c = D[i][j];
            if(t-c >= 0 && A[t-c][v] != -1)
                r = max(r, A[t-c][v]+sum[t][i]);
        }
        A[t][i] = r;
     }
}

void read_and_solve(void)
{
    int i, a, b, c;

    scanf("%d %d %d %d\n", &N, &M, &K, &P);

    for(i = 1; i <= M; i++)
        scanf("%d %d %d\n", &a, &b, &c), add_edge(a, b, c);

    for(i = 1; i <= K; i++)
    {
        scanf("%d %d %d\n", &a, &b, &c);
        sum[b][a] += c;
    }

    solve();

    for(i = 1; i <= P; i++)
    {
        scanf("%d %d\n", &a, &b);
        printf("%d\n", A[b][a]);
    }
}

int main(void)
{
    freopen("amenzi.in", "rt", stdin);
    freopen("amenzi.out", "wt", stdout);

    read_and_solve();

    return 0;
}