Cod sursa(job #2236222)

Utilizator Radu_FilipescuFilipescu Radu Radu_Filipescu Data 28 august 2018 17:51:02
Problema Amenzi Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.36 kb
#include <fstream>
#include <queue>
#include <vector>

#define TMAX 3502
#define NMAX 152
#define INF 99999999

using namespace std;

ifstream fin( "amenzi.in" );
ofstream fout( "amenzi.out");

int N, M, K;
int tasks;

vector < int > time_until; /// LA CAT VINE NEVASTA-SA
vector < int > place;      /// UNDE VINE NEVASTA-SA
int max_time;

vector < int > Ad [ NMAX ];
vector < int > Cost [ NMAX ];

int mat[ NMAX ][ TMAX ];
int amenda[ NMAX ][ TMAX ];

void Read()
{
  fin >> N >> M >> K >> tasks;

  int a, b, c;

  for( int i = 1; i <= M; ++i )
  {
    fin >> a >> b >> c;

    Ad[ a ].push_back( b );
    Cost[ a ].push_back( c );

    Ad[ b ].push_back( a );
    Cost[ b ].push_back( c );
  }

  for( int i = 1; i <= K; ++i )
  {
    fin >> a >> b >> c;

    amenda[ a ][ b ] += c;
  }

  for( int i = 1; i <= tasks; ++i )
  {
    fin >> a >> b;

    place.push_back( a );
    time_until.push_back( b );

    max_time = max( max_time, b );
  }

  fin.close();
}

void Do()
{
  for( int i = 1; i <= N; ++i )
    for( int j = 0; j <= max_time; ++j )
      mat[i][j] = -INF;

  mat[ 1 ][ 0 ] = 0;

  int w, c;

  for( int j = 1; j <= max_time; ++j )
    for( int i = 1; i <= N; ++i )
     {
       if( i == 1 && j == 0 ) continue;

       if( j > 0 && mat[ i ][ j - 1 ] > -INF )
         mat[ i ][ j ] = mat[ i ][ j - 1 ] + amenda[ i ][ j ];

       for( int it = 0; it < Ad[ i ].size(); ++it )
         {
           w = Ad[ i ][ it ];
           c = Cost[ i ][ it ];

           if( c <= j && mat[ w ][ j - c ] > -INF )
             mat[ i ][ j ] = max( mat[ i ][ j ], mat[ w ][ j - c ] + amenda[ i ][ j ] );

         }
     }
}

void Print()
{
  int A, B;
  bool ok;

  for( int i = 0; i < tasks; ++i )
  {
    A = place[ i ];
    B = time_until[ i ];
    ok = false;

    for( int j = B; j >= 0; --j )
      if( mat[ A ][ j ] > -INF )
       {
         ok = true;
         fout << mat[ A ][ j ] << '\n';
         break;
       }

    if( ! ok ) fout << "-1" << '\n';
  }

  fout.close();
}

void Test()
{
  for( int i = 1; i <= N; ++i )
  {
    for( int j = 0; j <= max_time; ++j )
      if( mat[i][j] == -INF ) fout << "* ";
      else fout << mat[i][j] << ' ';

    fout << '\n';
  }
}

int main()
{
    Read();
    Do();
    Print();

   // Test();

    return 0;
}