Cod sursa(job #552800)

Utilizator Addy.Adrian Draghici Addy. Data 12 martie 2011 21:09:20
Problema Amenzi Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.31 kb
#include <cstdio>
#include <list>

using namespace std;

#define NMAX 152
#define PMAX 8005
#define TMAX 3505

struct query {
	int x, y;
} Q[PMAX];

int A[NMAX][TMAX], S[NMAX][TMAX], tmax, n, m, k, p, i, j, h, x, y, c;
list < pair <int, int> > G[NMAX];
list < pair <int, int> >::iterator it;

int main () {
	
	freopen ("amenzi.in", "r", stdin);
	freopen ("amenzi.out", "w", stdout);
	
	scanf ("%d %d %d %d", &n, &m, &k, &p);
	
	for (i = 1; i <= m; i++) {
		scanf ("%d %d %d", &x, &y, &c);
		G[x].push_back (make_pair (y, c));
		G[y].push_back (make_pair (x, c));
	}
	
	for (i = 1; i <= k; i++) {
		scanf ("%d %d %d", &x, &y, &c);
		A[x][y] += c;
	}
	
	for (i = 1; i <= p; i++) {
		scanf ("%d %d", &x, &y);
		Q[i].x = x, Q[i].y = y;
		if (y > tmax) tmax = y;
	}
	
	memset (S, -1, sizeof (S));
	
	S[1][0] = A[1][0];
	for (j = 0; j <= tmax; j++)
		for (i = 1; i <= n; i++) {
			
			if (j > 0) S[i][j] = S[i][j-1];
			
			for (it = G[i].begin (); it != G[i].end (); it++) {
				h = it -> first, c = it -> second;
				if (j - c >= 0) S[i][j] = max (S[i][j], S[h][j - c]);
			}
			
			if (S[i][j] != -1 && A[i][j]) {
				if (S[i][j] == -1) S[i][j] = A[i][j];
				else S[i][j] += A[i][j];
			}
		}
	
	for (i = 1; i <= p; i++)
		printf ("%d\n", S[ Q[i].x ][ Q[i].y ]);
	
	return 0;
}