Cod sursa(job #16778)

Utilizator Binary_FireFlorin Pogocsan Binary_Fire Data 13 februarie 2007 23:37:17
Problema Amenzi Scor 20
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 Mmax 1501
#define Tmax 3201
int n,m,k,p,v[Nmax][Nmax],best[Tmax][Nmax],cost[Tmax][Nmax];
FILE *in,*out;

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

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

	in=fopen(fin,"r"); out=fopen(fout,"w");
	fscanf(in,"%i%i%i%i",&n,&m,&k,&p);

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

		fscanf(in,"%i%i%i",&a,&b,&c);
		v[a][b]=v[b][a]=c;

	}

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

		fscanf(in,"%i%i%i",&a,&b,&c);
		cost[a][b]+=c;

	}

	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<=n;++k) 

				if (j>=v[i][k] && v[i][k]) best1=maxf(best1,best[j-v[i][k]][k]);

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

			if (best1!=-1) best[j][i]=best1+cost[i][j];
		}

	for (i=1;i<=p;++i) {
		
		fscanf(in,"%i%i",&a,&b);
		fprintf(out,"%i\n",best[b][a]);
	}
	/*
	for (i=1;i<=n;++i) {
		for (j=0;j<=20;++j) 
			printf("%i ",best[j][i]);
		printf("\n");
	}
	*/
	fclose(in); fclose(out);
	return 0;
}