Pagini recente » Cod sursa (job #2272879) | Cod sursa (job #959078) | Cod sursa (job #2109755) | Cod sursa (job #2646572) | Cod sursa (job #2236221)
#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;
}