Cod sursa(job #237431)

Utilizator alexeiIacob Radu alexei Data 29 decembrie 2008 20:08:26
Problema Amenzi Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.42 kb
#include<stdio.h>
#include<string.h>
#include<vector>
#define TMAX 3502
#define NMAX 256
using namespace std;

int N,M,K,P;
int F[NMAX][TMAX],ANS[NMAX][TMAX];
vector< pair< int,int > > G[NMAX];

inline int max(const int a,const int b)
{
	return a>b?a:b;
}

inline int min(const int a,const int b)
{
	return a<b?a:b;
}

void read()
{
	scanf("%d%d%d%d\n",&N,&M,&K,&P);
	
	int i,j,k,a1,a2,a3;
	for(i=1; i<=M; ++i)
	{
		scanf("%d%d%d\n",&a1,&a2,&a3);
		G[a1].push_back(make_pair(a2,a3));
		G[a2].push_back(make_pair(a1,a3));
	}
	
	for(i=1; i<=K; ++i)
	{
		scanf("%d%d%d\n",&a1,&a2,&a3);//intersectia a1, timpul a2, amenda a3
		F[a1][a2]+=a3;
	}
}

void poirot()
{
	int i,j,a1;
	memset(ANS,0xff,sizeof(ANS));
	ANS[1][0]=0;
	vector< pair<int,int> >::iterator it;
	for(i=0; i<=3500; ++i)
	{
		for(j=1; j<=N; ++j)
		{
			if( ANS[j][i]!=-1 )
			{
				ANS[j][i]+=F[j][i];
				ANS[j][i+1]=max(ANS[j][i+1],ANS[j][i]);//stai pe loc
			
				for(it=G[j].begin(); it!=G[j].end(); ++it)
				{
					a1=i+it->second;
					if( a1<=3500 )
						ANS[it->first][a1]=max(ANS[it->first][a1],ANS[j][i]);
				}
			}
		}
	}
}

void show()
{
	int i,a1,a2;
	for(i=1; i<=P; ++i)
	{
		scanf("%d%d\n",&a1,&a2);
		a2=min(TMAX,a2);
		printf("%d\n",ANS[a1][a2]);
	}
}

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

	read();
	poirot();
	//
	show();
	return 0;
}