Cod sursa(job #263880)

Utilizator gabitzish1Gabriel Bitis gabitzish1 Data 20 februarie 2009 21:43:22
Problema Amenzi Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.29 kb
#include <cstdio>

int N, M, K, P, C[3505][155], a[155][155], am[3505][155];

typedef struct nod
{
	int x, c;
	nod *a;
} *pNod;
pNod v[155];

void add(int x, int y)
{
	pNod q = new nod;
	q -> x = y;
	q -> a = v[x];
	v[x] = q;
}

int max(int x, int y) { return x > y ? x : y;}

void init()
{
	int i, j;
	for (i = 0; i <= 3500; i++)
		for (j = 1; j <= N; j++) C[i][j] = -1;
}


int main()
{
	freopen("amenzi.in","r",stdin);
	freopen("amenzi.out","w",stdout);

	int i, j, x, y, c;

	scanf("%d %d %d %d", &N, &M, &K, &P);

	for (i = 1; i <= M; i++)
	{
		scanf("%d %d %d", &x, &y, &c);
		a[x][y] = a[y][x] = c;
		add(x, y); add(y, x);
	}

	init();


	for (i = 1; i <= K; i++)
	{
		scanf("%d %d %d", &x, &y, &c);
		am[y][x] += c;
	}
	C[0][1] = 0;

	for (i = 0; i <= 3500; i++)
	{
		for (j = 1; j <= N; j++)
		{
			if (C[i][j] != -1)
			{			
				C[i][j] += am[i][j];
				C[i + 1][j] = max(C[i][j], C[i + 1][j]);			
				
				for (pNod q = v[j]; q != NULL; q = q -> a)
					if (i + a[j][q -> x] <= 3500) 	
						C[i + a[j][q -> x]][q -> x] = max(C[i][j], C[i + a[j][q->x]][q ->x]);				
		
			}
//			printf("%6d ",C[i][j]);
		}
//		printf("\n");
	}

	for (i = 1; i <= P; i++)
	{
		scanf("%d %d", &x, &y);
		printf("%d\n", C[y][x]);
	}
	return 0;
}