Pagini recente » Cod sursa (job #2845318) | Cod sursa (job #495361) | Cod sursa (job #3169471) | Borderou de evaluare (job #224740) | Cod sursa (job #514781)
Cod sursa(job #514781)
#include <algorithm>
#include <cstring>
#include <fstream>
#include <vector>
using namespace std;
#define f first
#define s second
#define mp make_pair
#define pb push_back
const char Input[] = "amenzi.in";
const char Output[] = "amenzi.out";
ifstream fin( Input );
ofstream fout( Output );
const int Dim = 151;
const int Max = 3501;
const int Max2 = 15001;
char p[Max2];
int N, M, K, P;
int cnt, sol[Dim][Max];
vector < pair <int, int> > a[Dim], v[Dim];
void Calc( int nod, int tmp ) {
vector < pair <int, int> > :: iterator it;
if( sol[nod][tmp] != -1 )
return;
if( tmp > 0 ) {
Calc( nod, tmp - 1 );
sol[nod][tmp] = sol[nod][tmp - 1];
}
for( it = v[nod].begin(); it != v[nod].end(); ++it )
if( tmp - it->s >= 0 ) {
Calc( it->f, tmp - it->s );
sol[nod][tmp] = max( sol[nod][tmp], sol[it->f][tmp - it->s] );
}
if( sol[nod][tmp] < 0 )
sol[nod][tmp] = -2;
else
for( it = a[nod].begin(); it != a[nod].end() && it->f <= tmp; ++it )
if( it->f == tmp )
sol[nod][tmp] += it->s;
}
void Read( int &x ) {
while( !isdigit( p[cnt] ) )
if( ++cnt == Max2 ) {
fin.read( p, Max2 );
cnt = 0;
}
x = 0;
while( isdigit( p[cnt] ) ) {
x = x * 10 + p[cnt] - '0';
if( ++cnt == Max2 ) {
fin.read( p, Max2 );
cnt = 0;
}
}
}
int main() {
int i, c, x, y;
vector < pair <int, int> > :: iterator it;
Read( N ); //fin >> N;
Read( M ); //fin >> M;
Read( K ); //fin >> K;
Read( P ); //fin >> P;
while( M-- ) {
Read( x ); //fin >> x;
Read( y ); //fin >> y;
Read( c ); //fin >> c;
v[x].pb( mp( y, c ) );
v[y].pb( mp( x, c ) );
}
while( K-- ) {
Read( x ); //fin >> x;
Read( y ); //fin >> y;
Read( c ); //fin >> c;
a[x].pb( mp( y, c ) );
}
for( i = 1; i <= N; ++i )
sort( a[i].begin(), a[i].end() );
memset( sol, -1, sizeof( sol ) );
for( sol[1][0] = 0, it = a[1].begin(); it != a[1].end() && it->f == 0; ++it )
sol[1][0] += it->s;
while( P-- ) {
Read( x ); //fin >> x;
Read( y ); //fin >> y;
Calc( x, y );
fout << sol[x][y] << "\n";
}
///DE
// for( i = 1; i <= N; fout << "\n", ++i )
// for( int j = 0; j <= 50; ++j )
// fout << sol[i][j] << " ";
///BUG
fin.close();
fout.close();
return 0;
}