Cod sursa(job #10824)

Utilizator mockeBarca Cristian Mihai mocke Data 29 ianuarie 2007 18:11:04
Problema Amenzi Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.28 kb

#include <stdio.h>
#define MAX(a, b) ( (a) < (b) ? (b) : (a) )
#define NMAX 152
#define TMAX 3502
#define INF 1000000001

int V[NMAX][NMAX];
int Cost[NMAX][NMAX];
int A[TMAX][NMAX];
int Amenda[TMAX][NMAX];
int i, j, N, M, K, P;
int x, y, z, c, t, k;
int oras, time;

int main()
{
	freopen("amenzi.in", "r", stdin);
	freopen("amenzi.out", "w", stdout);
	
	scanf("%d %d %d %d", &N, &M, &K, &P);
	
	for (i = 0; i <= N; i++)
		for (j = 0; j <= N; j++) Cost[i][j] = -INF;
	
	for (i = 1; i <= M; i++) 
	{	
		scanf("%d %d %d", &x, &y, &z);
		
		V[x][++V[x][0]] = y;
		V[y][++V[y][0]] = x;
		
		Cost[x][y] = z;
		Cost[y][x] = z;
	}
	
	for (i = 1; i <= K; i++) 
	{	
		scanf("%d %d %d", &x, &y, &z);
		
	    Amenda[y][x] += z;
	}
	
	for(t = 0; t <= TMAX - 1; t++)
		   for(i = 0; i <= N; i++) A[t][i] = -INF;
	
	A[0][1] = 0;
	
	for (t = 0; t <= TMAX - 1; t++)
	{
		for (j = 1; j <= N; j++)
			for (k = 1; k <= V[j][0]; k++)
			{
				i = V[j][k];
				c = Cost[j][i];
			
				if (t-c >= 0 && (A[t-c][j] >= 0 || A[t-1][i] >= 0)) A[t][i] = MAX ( MAX (A[t-c][j], A[t-1][i]) + Amenda[t][i], A[t][i]);				
			}
			
		//printare();
	}
	
	
	for (i = 1; i <= P; i++)
	{
		scanf("%d %d", &oras, &time);
		
		printf("%d\n", A[time][oras]);	
	}
	
	
	return 0;
}