Pagini recente » Cod sursa (job #2115527) | Cod sursa (job #2071494) | Cod sursa (job #1005711) | Cod sursa (job #1643112) | Cod sursa (job #320188)
Cod sursa(job #320188)
#include <cstdio>
#include <vector>
using namespace std;
#define MAX_N 155
#define MAX_T 3505
#define INF 0x3f3f3f
#define x first
#define c second
#define foreach(V) for(typeof (V).begin() it = (V).begin(); it != (V).end(); ++it)
vector <pair<int, int> > G[MAX_N];
int N, M, K, P;
int A[MAX_T][MAX_N], S[MAX_T][MAX_N];
void citire()
{
scanf("%d %d %d %d",&N, &M, &K, &P);
for(int i = 1; i <= M; ++i)
{
int a, b, c;
scanf("%d %d %d",&a, &b, &c);
G[a].push_back(make_pair(b, c));
G[b].push_back(make_pair(a, c));
}
for(int i = 1; i <= K; ++i)
{
int a, b, c;
scanf("%d %d %d",&a, &b, &c);
A[b][a] += c;
}
}
void pre()
{
for(int i = 0; i <= MAX_T; ++i)
for(int j = 1; j <= N; ++j)
S[i][j] = -INF;
S[0][1] = A[0][1];
fprintf(stderr,"%d\n",S[0][1]);
for(int i = 1; i <= MAX_T; ++i)
for(int j = 1; j <= N; ++j)
{
S[i][j] = S[i-1][j];
foreach(G[j])
{
int x = it -> x;
int t = it -> c;
if((i < t) || (S[i - t][x] < 0)) continue;
S[i][j] = max(S[i][j], S[i - t][x]);
}
S[i][j] += A[i][j];
}
}
int main()
{
freopen("amenzi.in","rt",stdin);
freopen("amenzi.out","wt",stdout);
citire();
pre();
while(P--)
{
int a, b, rez(-1);
scanf("%d %d",&a, &b);
if(S[b][a] > 0) rez = S[b][a];
printf("%d\n",rez);
}
}