Cod sursa(job #10314)

Utilizator ProstuStefan-Alexandru Filip Prostu Data 28 ianuarie 2007 11:33:37
Problema Amenzi Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.54 kb
#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;
}