Cod sursa(job #11577)

Utilizator crusRus Cristian crus Data 31 ianuarie 2007 21:24:12
Problema Amenzi Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.25 kb
#include <stdio.h>
#define input "amenzi.in"
#define output "amenzi.out"
#define nmax 151
#define tmax 3501
long n,m,p,k,i,j,a,b,c,t[nmax][nmax],timp,nod,cost,amenda[nmax][tmax],ajunge[tmax][nmax],max,s[tmax][nmax],intersectie;
int main()
{
	FILE *fin, *fout;
	fin=fopen(input,"r");
	fout=fopen(output,"w");
	fscanf(fin,"%ld %ld %ld %ld",&n,&m,&k,&p);
	for (i=1;i<=m;i++)
		{
		 fscanf(fin,"%d %d %d",&a,&b,&c);
		 t[a][b]=c;
		 t[b][a]=c;
		}
	for (i=1;i<=k;i++)
		{
		 fscanf(fin,"%d %d %d",&nod,&timp,&cost);
		 amenda[nod][timp]=cost;
		}
	n=n;
	ajunge[0][1]=1;
	for (timp=0;timp<tmax;timp++)
		for (i=1;i<=n;i++)
			{
			if (ajunge[timp][i]) ajunge[timp+1][i]=ajunge[timp][i];
			if (ajunge[timp][i]==1)
				for (k=1;k<=n;k++) 
					if (t[i][k]) ajunge[timp+t[i][k]][k]=1;
			}	
    
	for (timp=0;timp<tmax;timp++)
		for (i=1;i<=n;i++)
			if (ajunge[timp][i])
				{
				 max=0;
				 for (k=1;k<=n;k++)
					 if (ajunge[timp-t[i][k]][k])
						 if (s[timp-t[i][k]][k]>max)
							 max=s[timp-t[i][k]][k];
                 s[timp][i]=max+amenda[i][timp];
				}

    for (i=1;i<=p;i++)
		{
		 fscanf(fin,"%d %d",&intersectie,&timp);
		 fprintf(fout,"%ld\n",s[timp][intersectie]);
		}
	fclose(fin);
	fclose(fout);
	return 0;	
}