Cod sursa(job #9492)

Utilizator goguGogu Marian gogu Data 27 ianuarie 2007 15:51:07
Problema Amenzi Scor 100
Compilator cpp Status done
Runda Unirea 2007, clasele 11-12 Marime 1.24 kb
#include <stdio.h>
#include <vector>
#define MaxT 3600
#define MaxN 160

int n, m, nr, nq;
int win[MaxN][MaxT], best[MaxN][MaxT];
int vec[MaxN][MaxN], t[MaxN][MaxN], gr[MaxN];

void expand(int k, int timp)
{
     int i, b=best[k][timp];
     if (b + win[k][timp+1] > best[k][timp+1]) best[k][timp+1]=b + win[k][timp+1];
     for (i=0; i<gr[k]; i++){
         int v = vec[k][i];
         int ora = timp + t[k][i];
         if (ora < MaxT && b+win[v][ora] > best[v][ora])
            best[v][ora]=b+win[v][ora];
     }
}

int main()
{
    freopen("amenzi.in", "r", stdin);
    freopen("amenzi.out", "w", stdout);
    int i,j,k;
    scanf("%d %d %d %d", &n, &m, &nr, &nq);
    while (m--){
        scanf("%d %d %d", &i, &j, &k);
        i--; j--;
        vec[i][gr[i]]=j; t[i][gr[i]++]=k; 
        vec[j][gr[j]]=i; t[j][gr[j]++]=k;
    }
    for (i=0; i<n; i++)
        memset(best[i], -1, 4*MaxT);
    while (nr--){
        scanf("%d %d %d", &i, &j, &k);
        win[i-1][j]+=k;
    }
    best[0][0]=win[0][0];
    for (j=0; j<=3500; j++)
        for (i=0; i<n; i++)
        if (best[i][j]>=0) expand(i,j);
    while (nq--){
          scanf("%d %d", &i, &j);
          printf("%d\n", best[i-1][j]);
    }
    return 0;
}