Pagini recente » Cod sursa (job #801566) | Cod sursa (job #2741838) | Cod sursa (job #2753005) | Cod sursa (job #2752590) | Cod sursa (job #10314)
Cod sursa(job #10314)
#include <cstdio>
#include <cstring>
#include <vector>
#include <algorithm>
using namespace std;
#define PB push_back
#define MP make_pair
const int NMAX = 154;
const int TMAX = 3636;
const int INF = 0x3f3f3f3f;
int N, M, K, P;
vector <pair <int, int> > G[NMAX];
vector <pair <int, int> > T[NMAX];
int DP[NMAX][TMAX];
int dinamica(int nod, int timp) {
if (timp < 0) return -1;
if (nod == 0 && timp == 0) return 0;
if (DP[nod][timp] != -1) return DP[nod][timp];
int &rez = DP[nod][timp];
unsigned i;
rez = dinamica(nod, timp - 1);
for (i = 0; i < G[nod].size(); ++i)
rez >?= dinamica(G[nod][i].first, timp - G[nod][i].second);
if (rez == -1) return rez = -2;
i = upper_bound(T[nod].begin(), T[nod].end(), MP(timp, -1)) - T[nod].begin();
while (i < T[nod].size() && T[nod][i].first < timp) ++i;
while (i < T[nod].size() && T[nod][i].first == timp)
rez += T[nod][i++].second;
return rez;
}
int main() {
FILE *fin = fopen("amenzi.in", "rt");
FILE *fout = fopen("amenzi.out", "wt");
int i, a, b, c;
fscanf(fin, " %d %d %d %d", &N, &M, &K, &P);
for (i = 0; i < M; ++i) {
fscanf(fin, " %d %d %d", &a, &b, &c);
--a; --b;
G[a].PB( MP(b, c) );
G[b].PB( MP(a, c) );
}
for (i = 0; i < K; ++i) {
fscanf(fin, "%d %d %d", &a, &b, &c);
T[a - 1].PB( MP(b, c) );
}
for (i = 0; i < N; ++i)
sort(T[i].begin(), T[i].end());
memset(DP, 0xff, sizeof(DP));
for (i = 0; i < P; ++i) {
fscanf(fin, " %d %d", &a, &b);
c = dinamica(a - 1, b);
fprintf(fout, "%d\n", c == -2 ? -1 : c);
}
fclose(fin);
fclose(fout);
return 0;
}