Cod sursa(job #517154)

Utilizator andrei.dAndrei Diaconeasa andrei.d Data 27 decembrie 2010 23:24:03
Problema Amenzi Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.18 kb
#include <cstdio>
#include <vector>
#include <algorithm>

using namespace std;

#define file_in "amenzi.in"
#define file_out "amenzi.out"

#define nmax 1555
#define MAXT (1<<12)

int N,M,K,P;
int din[MAXT][nmax];
vector< pair<int,int> > G[MAXT];
int amenda[MAXT][nmax];

int main(){
	
	int a,b,c;
	
	freopen(file_in,"r",stdin);
	freopen(file_out,"w",stdout);
	
	
	scanf("%d %d %d %d", &N, &M, &K, &P);
	for (int i=1;i<=M;++i){
		
		scanf("%d %d %d", &a, &b, &c);
		a--;b--;
		G[a].push_back(make_pair(b,c));
		G[b].push_back(make_pair(a,c));
	}
	for (int i=1;i<=K;++i){
		 scanf("%d %d %d", &a, &b, &c);
		 
		 a--;
		 amenda[b][a]+=c;
	}
	din[0][0]=1;
	vector< pair<int,int> > :: iterator it;

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

	for (int i=1;i<=P;++i){

		scanf("%d %d", &a, &b);
		a--;b--;
		printf("%d\n", din[b][a]-1);
	}
	
	return 0;
	
}