Pagini recente » Cod sursa (job #18957) | Cod sursa (job #3148885) | Cod sursa (job #1748420) | Cod sursa (job #3200140) | Cod sursa (job #313262)
Cod sursa(job #313262)
using namespace std;
#include<cstdio>
#include<vector>
#define MAX_T 3503
#define MAX_N 155
#define pb(x) push_back((x))
#define Inf 0x3f3f3f3f
int cst[MAX_T][MAX_N];
vector<int>G[MAX_N];
vector<int>M[MAX_N];
int bst[MAX_T][MAX_N];
int N,Muchii,K,P;
inline int max(int a, int b) { return (a>b)?a:b; }
int main()
{
freopen("amenzi.in","r",stdin);
freopen("amenzi.out","w",stdout);
scanf("%d%d%d%d",&N,&Muchii,&K,&P);
int i,j,k,t,y;
int X,Y,a,b,c;
for(i=1;i<=Muchii;++i)
{
scanf("%d%d%d",&a,&b,&c);
G[a].pb(b);
G[b].pb(a);
M[a].pb(c);
M[b].pb(c);
}
for(i=1;i<=K;++i)
{
scanf("%d%d%d",&a,&b,&c); // intersectia a, la timpul b
cst[b][a] +=c;
}
for(i=0;i<MAX_T;++i) for(j=1;j<=N;++j) bst[i][j] = -Inf;
bst[0][1] = cst[0][1];
for(i=1;i<MAX_T-1;++i)
for(j=1;j<=N;++j)
{
if(bst[i-1][j] != -1) bst[i][j] = bst[i-1][j];
for(y = 0; y < G[j].size(); ++y)
{
k = G[j][y];
t = M[j][y]; // am muchie de la j la k cu costul t
if(i - t < 0 || bst[i-t][k] == -Inf) continue;
bst[i][j] = max(bst[i][j], bst[i-t][k]);
}
if ( bst[i][j] != -Inf) bst[i][j] += cst[i][j];
}
for(i=1;i<=P;++i)
{
scanf("%d%d",&X,&Y);
printf("%d\n",bst[Y][X]);
}
return 0;
}