Cod sursa(job #10694)

Utilizator ZeusCatalin Tiseanu Zeus Data 28 ianuarie 2007 23:45:03
Problema Amenzi Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.57 kb

using namespace std;

#include <cstdio>
#include <vector>

int N, M, K, P, Fine[151][3502], opt[151][3502];
vector<int> g[151], co[151];

int main()
{
    freopen("amenzi.in", "r", stdin);
    freopen("amenzi.out", "w", stdout);   
    
    scanf("%d %d %d %d", &N, &M, &K, &P);
    
    int a, b, c;
    
    for( int i = 1; i <= M; i++ )
    {
         scanf("%d %d %d", &a, &b, &c);
         g[a].push_back(b), g[b].push_back(a);
         co[a].push_back( c ), co[b].push_back( c );     
    }
    
    for( int i = 1; i <= K; i++ )
    {
         scanf("%d %d %d", &a, &b, &c );     
         Fine[a][b] >?= c;
    }
    
    for( int time = 0; time <= 3500; time++ )
         for( int i = 1; i <= N; i++ )
              opt[i][time] = -1;
    
    opt[1][0] = Fine[1][0];
    
    for( int time = 1; time <= 3500; time++ )    
         for( int i = 1; i <= N; i++ )
         {
              if( opt[i][time-1] >= 0 )
              opt[i][time] >?= opt[i][time-1] + Fine[i][time];
              
              for( int j = 0; j < (int)g[i].size(); j++ )
              {
                  a = g[i][j], c = co[i][j];       
              
                  if( c > time )
                      continue;
                  
                  if( opt[a][time-c] >= 0 )
                  opt[i][time] >?= opt[ a ][ time - c ] + Fine[i][time];    
              }
         }
    
    for( int i = 1; i <= P; i++ )
    {
         scanf("%d %d", &a, &b);
         printf("%d\n", (opt[a][b] >= 0 ) ? opt[a][b]: -1 );     
    }
    
    return 0; 
}