Cod sursa(job #1221087)

Utilizator pulseOvidiu Giorgi pulse Data 19 august 2014 13:33:13
Problema Amenzi Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.16 kb
#include <cstdio>
#include <vector>

using namespace std;

const int MAXN = 155;
const int MAXT = 3501;
int N, M, K, P;
int DP[MAXN][MAXT], A[MAXN][MAXT];
vector < pair <int, int> > G[MAXN];
vector < pair <int, int> > :: iterator it;

void Preprocesare()
{
	for (int i = 0; i < MAXN; ++i)
		for (int j = 0; j < MAXT; ++j)
			DP[i][j] = -1;
	DP[1][0] = 0;
	for (int i = 0; i < MAXT; ++i)
	{
		for (int j = 1; j <= N; ++j)
		{
			if (i > 0) DP[j][i] = DP[j][i - 1];
			for (it = G[j].begin(); it != G[j].end(); ++it)
			{
				if (i >= it -> second)
					DP[j][i] = max(DP[j][i], DP[it -> first][i - it -> second]);
			}
			if (DP[j][i] != -1)
				DP[j][i] += A[j][i];
		}
	}
}

int main()
{
	freopen("amenzi.in", "r", stdin);
	freopen("amenzi.out", "w", stdout);
	int a, b, c;
	scanf("%d %d %d %d\n", &N, &M, &K, &P);
	for (; M; --M)
	{
		scanf("%d %d %d\n", &a, &b, &c);
		G[a].push_back(make_pair(b, c));
		G[b].push_back(make_pair(a, c));
	}
	for (; K; --K)
	{
		scanf("%d %d %d\n", &a, &b, &c);
		A[a][b] += c;
	}
	Preprocesare();
	for (; P; --P)
	{
		scanf("%d %d\n", &a, &b);
		printf("%d\n", DP[a][b]);
	}
	return 0;
}