Cod sursa(job #313262)

Utilizator FlorianFlorian Marcu Florian Data 8 mai 2009 15:59:09
Problema Amenzi Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.23 kb
using namespace std;
#include<cstdio>
#include<vector>
#define MAX_T 3503
#define MAX_N 155
#define pb(x) push_back((x))
#define Inf 0x3f3f3f3f
int cst[MAX_T][MAX_N];
vector<int>G[MAX_N];
vector<int>M[MAX_N];
int bst[MAX_T][MAX_N];
int N,Muchii,K,P;
inline int max(int a, int b) { return (a>b)?a:b; }
int main()
{
	freopen("amenzi.in","r",stdin);
	freopen("amenzi.out","w",stdout);
	scanf("%d%d%d%d",&N,&Muchii,&K,&P);
	int i,j,k,t,y;
	int X,Y,a,b,c;
	for(i=1;i<=Muchii;++i)
	{
		scanf("%d%d%d",&a,&b,&c);
		G[a].pb(b);
		G[b].pb(a);
		M[a].pb(c);
		M[b].pb(c);
	}
	for(i=1;i<=K;++i) 
	{
		scanf("%d%d%d",&a,&b,&c); // intersectia a, la timpul b
		cst[b][a] +=c;
	}
	for(i=0;i<MAX_T;++i) for(j=1;j<=N;++j) bst[i][j] = -Inf;
	bst[0][1] = cst[0][1];
	for(i=1;i<MAX_T-1;++i)
		for(j=1;j<=N;++j)
		{
			if(bst[i-1][j] != -1) bst[i][j] = bst[i-1][j];
			for(y = 0; y < G[j].size(); ++y)
			{
				k = G[j][y]; 
				t = M[j][y]; // am muchie de la j la k cu costul t
				if(i - t < 0 || bst[i-t][k] == -Inf) continue;
				bst[i][j] = max(bst[i][j], bst[i-t][k]);
			}
			if ( bst[i][j] != -Inf) bst[i][j] += cst[i][j];
		}
	for(i=1;i<=P;++i)
	{
		scanf("%d%d",&X,&Y);
		printf("%d\n",bst[Y][X]);
	}
	return 0;
}