Pagini recente » Cod sursa (job #76477) | Cod sursa (job #135178) | Cod sursa (job #1932772) | Cod sursa (job #2230051) | Cod sursa (job #329638)
Cod sursa(job #329638)
# include <cstdio>
# include <vector>
using namespace std;
# define FIN "amenzi.in"
# define FOUT "amenzi.out"
# define max(a, b) (a > b ? a : b)
# define pb push_back
# define mp make_pair
# define f first
# define s second
# define MAX_T 3510
# define MAX_P 8010
# define MAX_N 160
int N, M, K, P, i, j, max_t;
vector <pair <int, int> > G[MAX_N];
vector <pair <int, int> > :: iterator it;
int Best[MAX_N][MAX_T];
int Infractiune[MAX_N][MAX_T];
int X[MAX_P], Y[MAX_P];
int main()
{
freopen(FIN, "r", stdin);
freopen(FOUT, "w", stdout);
scanf("%d%d%d%d", &N, &M, &K, &P);
int a, b, c;
for (i = 1; i <= M; ++i)
{
scanf("%d%d%d", &a, &b, &c);
G[a].pb(mp(b, c)); G[b].pb(mp(a, c));
}
for (i = 1; i <= K; ++i)
{
scanf("%d%d%d", &a, &b, &c);
Infractiune[a][b] += c;
}
for (i = 1; i <= P; ++i)
{
scanf("%d%d", &X[i], &Y[i]);
max_t = max(max_t, Y[i]);
}
memset(Best, -1, sizeof(Best));
Best[1][0] = Infractiune[1][0];
for (i = 1; i <= max_t; ++i)
for (j = 1; j <= N; ++j)
{
Best[j][i] = Best[j][i - 1];
for (it = G[j].begin(); it != G[j].end(); ++it)
if (it -> s <= i)
Best[j][i] = max(Best[j][i], Best[it -> f][i - it -> s]);
if (Infractiune[j][i] && Best[j][i] != -1) Best[j][i] += Infractiune[j][i];
}
for (i = 1; i <= P; ++i)
Best[X[i]][Y[i]] != -1 ? printf("%d\n", Best[X[i]][Y[i]]) : printf("0\n");
return 0;
}