Cod sursa(job #12347)

Utilizator crusRus Cristian crus Data 3 februarie 2007 16:48:56
Problema Amenzi Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.82 kb
#include <stdio.h>
#define input "amenzi.in"
#define output "amenzi.out"
#define nmax 151
#define tmax 3501
int n,m,p,k,i,j,a,b,c,v[nmax][nmax],timp,nod,cost,amenda[nmax][2*tmax],ajunge[2*tmax][nmax],max,intersectie;
int s[2*tmax][nmax],nv[nmax],tp[nmax][nmax];
inline long maxim(long a, long b)
{
 if (a>b) return a;
	else return b;
}
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,"%ld %ld %ld",&a,&b,&c);
		 v[a][++nv[a]]=b;
		 v[b][++nv[b]]=a;
		 tp[a][nv[a]]=c;
		 tp[b][nv[b]]=c;
		}
	for (i=1;i<=k;i++)
		{
		 fscanf(fin,"%ld %ld %ld",&nod,&timp,&cost);
		 if (amenda[nod][timp]==0||amenda[nod][timp]<cost) amenda[nod][timp]=cost;		 
		}
	
	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<=nv[i];k++) 
					ajunge[timp+tp[i][k]][v[i][k]]=1;
			}	
    

	//ajunge[timp][nod]=1 daca ajunge dupa timp secunde in nodul nod
	//					0 daca nu ajunge dupa timp secunde in nodul nod		              
	//nv[nod]= numarul de vecini ai nodului nod
	//v[y][x] la x-lea vecin al nodului y
	//amenda[nod][timp] este amenda maxima pe care o poate lua daca se afla in nodul nod la momentul de timp timp
	//tp[x][y] este timpul pe care il parcurge din intersectia x in intersectia y

	for (timp=0;timp<tmax;timp++)
		for (i=1;i<=n;i++)
			if (ajunge[timp][i])				
				 for (k=1;k<=nv[i];k++)
					 s[timp+tp[i][k]][v[i][k]]=maxim(s[timp+tp[i][k]][v[i][k]],s[timp][i]+amenda[v[i][k]][timp+tp[i][k]]);
				 

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