Cod sursa(job #16787)

Utilizator Binary_FireFlorin Pogocsan Binary_Fire Data 14 februarie 2007 00:40:04
Problema Amenzi Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.08 kb
#include<stdio.h>
#define fin  "amenzi.in"
#define fout "amenzi.out"
#define Nmax 151
#define Tmax 3501

int N,M,K,P;
int v[Nmax][Nmax],c[Nmax][Nmax];
int am[Nmax][Tmax],best[Tmax][Nmax];

FILE *in,*out;

inline int maxf(int a,int b) { (a>b)?(a):(a=b); return a; }

int main() {
int i,j,k;
int a,b,cost,best1;

	in=fopen(fin,"r"); out=fopen(fout,"w");
	
	fscanf(in,"%i%i%i%i",&N,&M,&K,&P);

	for (; M>0; --M) {

		fscanf(in,"%i%i%i",&a,&b,&cost);

		v[a][++v[a][0]]=b; c[a][v[a][0]]=cost;
		v[b][++v[b][0]]=a; c[b][v[b][0]]=cost;
	}

	for (; K>0; --K) {

		fscanf(in,"%i%i%i",&a,&b,&cost);

		am[a][b]+=cost;

	}

	for (j=0;j<Tmax;++j)

		for (i=1;i<=N;++i) 

			best[j][i]=-1;

	for (j=0;j<Tmax;++j) 

		for (i=1;i<=N;++i) {

			best1=-1;

			if (i==1) best1=0;

			for (k=1;k<=v[i][0];++k) 

				if (j>=c[i][k]) 

					best1=maxf(best1,best[j-c[i][k]][v[i][k]]);

			if (j>0) best1=maxf(best1,best[j-1][i]);

			if (best1!=-1) best1+=am[i][j];

			best[j][i]=best1;
		}

	for (; P>0; P--) {

		fscanf(in,"%i%i",&a,&b);

		fprintf(out,"%i\n",best[b][a]);

	}

	fclose(in); fclose(out);

	return 0;
}