Cod sursa(job #1087112)

Utilizator antonioteoZait Teodor Antonio antonioteo Data 18 ianuarie 2014 22:33:40
Problema Amenzi Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.2 kb
#include <fstream>
#include <algorithm>
using namespace std;

ifstream fin("amenzi.in");
ofstream fout("amenzi.out");

#define NMAX 151
#define TMAX 3501

int i, j, N, M, K, P;
int a, b, c;
int X, Y;
int tmax;

int dp[TMAX][NMAX];

struct nod {
	int u;
	int Cost;
	nod *next;
};
nod *v[NMAX];

bool Used[NMAX];
int A[TMAX][NMAX];

inline void add(int i, int j, int c) {
	nod *p = new nod;
	p->u = j;
	p->Cost = c;
	p->next = v[i];
	v[i] = p;
}

int main() {
	fin >> N >> M >> K >> P;
	for (i = 1; i <= M; ++i) {
		fin >> a >> b >> c;
		add(a, b, c);
		add(b, a, c);
	}
	//for (i = 1; i <= N; ++i) 
	//	add(i, i, 1);
	for (i = 1; i <= K; ++i) {
		fin >> a >> b >> c;
		A[b][a] += c;
	}
	for (i = 0; i < TMAX; ++i) 
		for (j = 0; j <= N; ++j)
			dp[i][j] = -1;
	dp[0][1] = A[0][1];
	for (i = 1; i < TMAX; ++i) {
		for (j = 1; j <= N; ++j) {
			dp[i][j] = max(dp[i][j], dp[i - 1][j]);
			for (nod *k = v[j]; k; k = k->next) {
				if (i - k->Cost >= 0)
					dp[i][j] = max(dp[i][j], dp[i - k->Cost][k->u]);
			}
			if (dp[i][j] == -1) continue;
			dp[i][j] += A[i][j];
		}
	}
	for (i = 1; i <= P; ++i) {
		fin >> X >> Y;
		fout << dp[Y][X] << '\n';
	}
	return 0;
}