Cod sursa(job #10931)

Utilizator MariusMarius Stroe Marius Data 29 ianuarie 2007 22:19:33
Problema Amenzi Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.04 kb
#include <cstdio>
#include <cstdlib>
#include <ctime>
using namespace std;

const char iname[] = "amenzi.in";
const char oname[] = "amenzi.out";

#define MAX_N 155
#define MAX_T 3505

int G[MAX_N][MAX_N];

int A[MAX_T][MAX_N];

int R[MAX_T][MAX_N], S[MAX_T][MAX_N], in[MAX_T][MAX_N];


int solve(int t, int i, int n)
{
	if ((t == 0) && (i == 1)) {
		R[t][i] = 0;
		in[t][i] = 1;
	}
	if (in[t][i])
		return R[t][i];
	if ((t > 0) && (S[t - 1][i] == 0))
		R[t][i] = solve(t - 1, i, n);
	for (int j = 1; j <= n; ++j) {
		if ((G[i][j] > 0) && (t >= G[i][j])) {
			solve(t - G[i][j], j, n);
			if ((S[t - G[i][j]][j] == 0) && (R[t][i] < R[t - G[i][j]][j]))
				R[t][i] = R[t - G[i][j]][j];
		}
	}
	if (R[t][i] != -1)
		R[t][i] += A[t][i];
	in[t][i] = 1;
	return R[t][i];
}

inline void shift(int & a, int & b) {
	a ^= b ^= a ^= b;
}

void write_out(int n, int m, int k, int p)
{
	FILE *fo = fopen(iname, "w");
	int i;
	int x, y, c;
	fprintf(fo, "%d %d %d %d\n", n, m, k, p);
	for (i = 0; i < m; ++i) {
		x = rand() % MAX_N + 1;
		y = rand() % MAX_N + 1;
		c = rand() + 1;
		fprintf(fo, "%d %d %d\n", x, y, c);
	}
	for (i = 0; i < k; ++i) {
		x = rand() % MAX_N + 1;
		y = rand() % MAX_T;
		c = rand();
		fprintf(fo, "%d %d %d\n", x, y, c);
	}
	for (i = 0; i < p; ++i) {
		x = rand() % MAX_N + 1;
		y = rand() % MAX_T;
		fprintf(fo, "%d %d\n", x, y);
	}
	fclose(fo);
}

int main(void) 
{
//	write_out(150, 1500, 12000, 8000);
	freopen(iname, "r", stdin);
	int N, M;
	int K, P;
	int i, j, x, y, c, t;

	for (scanf("%d %d %d %d", &N, &M, &K, &P), i = 0; i < M; ++i) {
		scanf("%d %d %d", &x, &y, &c);
		G[x][y] = G[y][x] = c;
	}
	
	for (i = 0; i < K; ++i) {
		scanf("%d %d %d", &x, &t, &c);
		A[t][x] += c;
	}
	
	for (t = 0; t < MAX_T; ++t)
		for (i = 1; i <= N; ++i)   
			R[t][i] = -1;
	
	for (t = 0; t < MAX_T; ++t)
		for (i = 1; i <= N; ++i)
			solve(t, i, N);
	
	freopen(oname, "w", stdout);
	
	for (i = 0; i < P; ++i) {
		scanf("%d %d", &x, &t);
		printf("%d\n", R[t][x]);
	}
	return 0;
}