Cod sursa(job #320186)

Utilizator Mishu91Andrei Misarca Mishu91 Data 3 iunie 2009 21:50:09
Problema Amenzi Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.14 kb
#include <cstdio>
#include <vector>

using namespace std;

#define MAX_N 155
#define MAX_T 3505
#define INF 0x3f3f3f

#define x first
#define c second
#define foreach(V) for(typeof (V).begin() it = (V).begin(); it != (V).end(); ++it)

vector <pair<int, int> > G[MAX_N];
int N, M, K, P;
int A[MAX_T][MAX_N], S[MAX_T][MAX_N];

void citire()
{
	scanf("%d %d %d %d",&N, &M, &K, &P);
	
	for(int i = 1; i <= M; ++i)
	{
		int a, b, c;
		scanf("%d %d %d",&a, &b, &c);
		
		G[a].push_back(make_pair(b, c));
		G[b].push_back(make_pair(a, c));
	}
	
	for(int i = 1; i <= K; ++i)
	{
		int a, b, c;
		scanf("%d %d %d",&a, &b, &c);
		
		A[b][a] = c;
	}
}

void pre()
{
	for(int i = 2; i <= N; ++i)
		S[0][i] = -INF;
	for(int i = 1; i <= MAX_T; ++i)
		for(int j = 1; j <= N; ++j)
		{
			S[i][j] = S[i-1][j];
			
			foreach(G[j])
			{
				int x = it -> x;
				int t = it -> c;
				
				if(i < t) continue;
				
				S[i][j] = max(S[i][j], S[i - t][x]);
			}
			
			S[i][j] += A[i][j];
		}
}

int main()
{
	freopen("amenzi.in","rt",stdin);
	freopen("amenzi.out","wt",stdout);
	
	citire();
	pre();
	
	while(P--)
	{
		int a, b;
		scanf("%d %d",&a, &b);
		printf("%d\n",S[b][a]);
	}
}