Cod sursa(job #129327)

Utilizator floringh06Florin Ghesu floringh06 Data 28 ianuarie 2008 23:43:26
Problema Amenzi Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.69 kb
#include <cstdio>   
#include <cstring>   

using namespace std;
  
#define FIN "amenzi.in"
#define FOUT "amenzi.out"  
#define N_MAX 155   
#define M_MAX 1505
#define INF 10000000   
  
int A[M_MAX << 1][N_MAX]; 
int T[M_MAX << 1][N_MAX];   
int a[M_MAX];
int b[M_MAX];
int c[M_MAX];   

int N, M, k, p, i, t, x, y;   
  
    inline int maxim(int a, int b) {if (a > b) return a; else return b;}   
  
    void solve()   
    {   
         int i, j;   
         memset(A, -INF, sizeof(A));   
         // dinamica
         A[0][1] = T[0][1];   
         for(i = 1; i < M_MAX << 1; ++i)   
         {   
               for(j = 1; j <= M; ++j)   
               {   
                     A[i][a[j]] = maxim(A[i][a[j]], A[i - 1][a[j]]);   
                     if(i - c[j] >= 0) A[i][a[j]] = maxim(A[i][a[j]], A[i - c[j]][b[j]]);   
                     A[i][b[j]] = maxim(A[i][b[j]], A[i - 1][b[j]]);   
                     if(i - c[j] >= 0) A[i][b[j]] = maxim(A[i][b[j]], A[i - c[j]][a[j]]);   
               }   
               for(j = 1; j <= N; ++j) A[i][j] += T[i][j];   
         }   
    }   

    int main()   
    {   
        freopen(FIN, "r", stdin);   
        freopen(FOUT, "w", stdout);   
    
        scanf("%d %d %d %d", &N, &M, &k, &p);   
        for(i = 1; i <= M; ++i)   
              scanf("%d %d %d", a + i, b + i, c + i);
        for(i = 1; i <= k; ++i)   {   
              scanf("%d %d %d", &x, &t, &y);   
              T[t][x] += y;   
        }
  
        solve();   
        for(i = 0; i < p; ++i)   
        {   
            scanf("%d %d", &x, &y);   
            printf("%d\n", A[y][x]);   
        }
        
        return 0;   
    }