Cod sursa(job #10925)

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

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

#define MAX_N 151
#define MAX_T 3501

int G[MAX_N][MAX_N], D[MAX_N][MAX_N], deg[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 X, int n)
{
	if ((T == 0) && (X == 1)) {
		R[T][X]  = 0;
		in[T][X] = 1;
	} else
		R[T][X] = -1;

	if (in[T][X])
		return R[T][X];

	if ((T > 0) && (S[T - 1][X] == 0))
		R[T][X] = solve(T - 1, X, n);
	for (int i = 0; i < deg[X]; ++i) {
		int Y = G[X][i];
		int C = D[X][i];
		if ((C > 0) && (T >= C)) {
			solve(T - C, Y, n);
			if ((S[T - C][Y] == 0) && (R[T][X] < R[T - C][Y]))
				R[T][X] = R[T - C][Y];
		}
	}
	if (R[T][X] != -1)
		R[T][X] += A[T][X];
	in[T][X] = 1;
	return R[T][X];
}

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(50, 2500, 12000, 17);
	freopen(iname, "r", stdin);
	int N, M;
	int K, P;
	int X, Y, C, T;

	scanf("%d %d %d %d", &N, &M, &K, &P);
	for (int i = 0; i < M; ++i) {
		scanf("%d %d %d", &X, &Y, &C);
		G[X][deg[X]] = Y, D[X][deg[X]] = C;
		deg[X] ++;
		G[Y][deg[Y]] = X, D[Y][deg[Y]] = C;
		deg[Y] ++;
	}
	for (int i = 0; i < K; ++i) {
		scanf("%d %d %d", &X, &T, &C);
		A[T][X] += C;
	}
	for (T = 0; T < MAX_T; ++T)
		for (X = 1; X <= N; ++X)
			solve(T, X, N);
	
	freopen(oname, "w", stdout);
	
	for (int i = 0; i < P; ++i) {
		scanf("%d %d", &X, &T);
		printf("%d\n", R[T][X]);
	}
	return 0;
}