Cod sursa(job #9548)

Utilizator TheCreeepIonita Andrei Lucian TheCreeep Data 27 ianuarie 2007 16:08:16
Problema Amenzi Scor 10
Compilator c Status done
Runda Unirea 2007, clasele 11-12 Marime 2.13 kb
#include <stdio.h>
struct crime {
	int t,w,a;
} cr[12001];
struct intalnire {
	int a,b;
} p[8001];
int n,m,K,P,mat[3501][151],drum[151][151],i,j,k,last;
FILE *f;
void cit()
{
	int a,b,c;
	f=fopen("amenzi.in","r");
	fscanf(f,"%d %d %d %d",&n,&m,&K,&P);
	for(i=1;i<=m;i++)
	{
		fscanf(f,"%d %d %d",&a,&b,&c);
		drum[a][b]=c;
		drum[b][a]=c;
	}
	for(i=1;i<=K;i++)
		fscanf(f,"%d %d %d",&cr[i].w, &cr[i].t, &cr[i].a);
	for(i=1;i<=P;i++)
		fscanf(f,"%d %d",&p[i].a,&p[i].b);
	fclose(f);
}
void drumuri()
{
	for(i=1;i<=n;i++)
	for(j=1;j<=n;j++) if (i!=j)
	for(k=1;k<=n;k++) if (i!=k && j!=k && drum[i][k] && drum[j][k])
	if (drum[i][j]==0 || drum[i][j]>drum[i][k]+drum[j][k])
	{
		drum[i][j]=drum[i][k]+drum[j][k];
		drum[j][i]=drum[i][j];
	}
}
static int cmp (void * a, void * b)
{
	struct crime * aa = (struct crime*) a;
	struct crime * bb = (struct crime*) b;
	return aa->t - bb->t;	
}
void rez()
{
//	mat [ time, nod]
	last=0;
	for(i=2;i<=n;i++) mat[0][i]=-1;
	for(i=1;i<=K;i++)
	{
		for(j=last+1; j<cr[i].t; j++)for(k=1;k<=n;k++) if (mat[j][k]==0)mat[j][k]=mat[j-1][k];
		last=cr[i].t-1;
		for(j=1;j<=n;j++) if (j!=cr[i].w)
			if (cr[i].t>=drum[j][cr[i].w] && mat[cr[i].t-drum[j][cr[i].w]][j]!=-1 && mat[cr[i].t-drum[j][cr[i].w]][j]+cr[i].a > mat[cr[i].t][cr[i].w]) 
			{
			mat[cr[i].t][cr[i].w] = mat[cr[i].t-drum[j][cr[i].w]][j]+cr[i].a;
//			printf("%d %d %d %d %d %d %d\n",cr[i].t,cr[i].w,cr[i].a,j,drum[j][cr[i].w], mat[cr[i].t-drum[j][cr[i].w]][j], mat[cr[i].t][cr[i].w]);
			}
		if (mat[cr[i].t-1][cr[i].w] != -1 && mat[cr[i].t][cr[i].w]<mat[cr[i].t-1][cr[i].w]+cr[i].a) mat[cr[i].t][cr[i].w]=mat[cr[i].t-1][cr[i].w]+cr[i].a;
	}
}
void scr()
{
	int max=0;
	f=fopen("amenzi.out","w");
	for(i=last;i<=3500;i++) 
	for(j=1;j<=n;j++) if (mat[i][j]==0)mat[i][j]=mat[i-1][j];
	for(i=1;i<=P;i++)
	{
		max=mat[p[i].b][p[i].a]; if (max==-1) max=0;
		for(j=1;j<=n;j++) if (j!=p[i].a)
			if (p[i].b>=drum[j][p[i].a] && mat[p[i].b-drum[j][p[i].a]][j]!=-1 && mat[p[i].b-drum[j][p[i].a]][j] > max) 
			max = mat[p[i].b-drum[j][p[i].a]][j];
	fprintf(f,"%d\n",max);
	}
	fclose(f);
}
int main (void)
{
	cit();
	drumuri();
	qsort(cr+1, K, sizeof(struct crime), cmp);
	rez();
	scr();
	return 0;
}