Pagini recente » Cod sursa (job #295369) | Cod sursa (job #2837689) | Cod sursa (job #2977299) | Cod sursa (job #2506470) | Cod sursa (job #9878)
Cod sursa(job #9878)
#include <cstdio>
#include <vector>
#include <queue>
using namespace std;
#define MAXN 155
#define MAXT 3505
int N, M, K, P;
vector< pair<int, int> > con[MAXN];
int TMAX = -1;
int infrac[MAXT][MAXN];
int best[MAXT][MAXN];
vector< pair<int, int> > query;
queue< pair<int, int> > Q;
int main()
{
freopen("amenzi.in", "rt", stdin);
freopen("amenzi.out", "wt", stdout);
scanf("%d %d %d %d", &N, &M, &K, &P);
for (; M; M--)
{
int i, j, k;
scanf("%d %d %d", &i, &j, &k);
con[i].push_back( make_pair(j, k) );
con[j].push_back( make_pair(i, k) );
if (k > TMAX)
TMAX = k;
}
for (; K; K--)
{
int i, j, k;
scanf("%d %d %d", &i, &j, &k);
infrac[j][i] += k;
}
for (int k = 0; k < P; k++)
{
int i, j;
scanf("%d %d", &i, &j);
if (j > TMAX)
TMAX = j;
query.push_back( make_pair(j, i) );
}
memset(best, -1, sizeof(best));
best[0][1] = infrac[0][1];
for (int i = 0; i <= TMAX; i++)
for (int j = 1; j <= N; j++)
{
if (best[i][j] == -1)
continue;
if (best[i][j] + infrac[i + 1][j] > best[i + 1][j])
best[i + 1][j] = best[i][j] + infrac[i + 1][j];
vector< pair<int, int> > :: iterator it;
for (it = con[j].begin(); it != con[j].end(); it++)
{
int nxt, nxtT, nxtC;
nxt = (*it).first;
nxtT = i + (*it).second;
nxtC = best[i][j] + infrac[nxtT][nxt];
if (nxtC > best[nxtT][nxt])
best[nxtT][nxt] = nxtC;
}
}
for (int i = 0; i < P; i++)
printf("%d\n", best[ query[i].first ][ query[i].second ]);
return 0;
}