Cod sursa(job #425738)

Utilizator otilia_sOtilia Stretcu otilia_s Data 26 martie 2010 00:10:20
Problema Amenzi Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.34 kb
#include <cstdio>
#include <vector>
using namespace std;
#define NMAX 154
#define TMAX 3504
#define s second
#define f first
bool viz[TMAX][NMAX];
int C[TMAX][NMAX],Am[TMAX][NMAX];
vector < pair<short,int> > A[NMAX];

int main()
{
    freopen("amenzi.in","r",stdin);
	int n,m,k,P,i,t;
	scanf("%d %d %d %d",&n,&m,&k,&P);
	for (i=1;i<=m;++i)
	{ int x,y,ct;
		scanf("%d %d %d",&x,&y,&ct);
		A[x].push_back(make_pair(y,ct));
		A[y].push_back(make_pair(x,ct));
	}
	for (i=1;i<=k;++i) 
	{ int x,y,c;
		scanf("%d %d %d",&x,&y,&c);
		Am[y][x]+=c;
	}
	
	memset(viz,0,sizeof(viz));
	unsigned j;
	C[0][1]=Am[0][1]; viz[0][1]=1;
	
	for (i=0;i<A[1].size();++i)
	 if (!A[1][i].s) 
		{ viz[0][A[1][i].f]=1; 
		  C[0][A[1][i].f]=Am[0][A[1][i].f];
		}
	
	for (t=1;t<=TMAX;++t)
	 for (i=1;i<=m;++i)
	  {
		if (viz[t-1][i]) {viz[t][i]=1;               
						  C[t][i]=C[t-1][i];
						 }	
		for (j=0;j<A[i].size();++j)
		 if (t>=A[i][j].s)
		  if (viz[t-A[i][j].s][A[i][j].f])		   
		   {
			viz[t][i]=1;
			if (C[t-A[i][j].s][A[i][j].f]>C[t][i])
				C[t][i]=C[t-A[i][j].s][A[i][j].f];
		   }
		  
		if (viz[t][i]) C[t][i]+=Am[t][i];
	  }
	
	  freopen("amenzi.out","w",stdout);
	  for (i=1;i<=P;++i)
	  { int x,y;
		scanf("%d %d",&x,&y);
		if (!viz[y][x]) printf("-1\n");
		   else	printf("%d\n",C[y][x]);
	  }
	return 0;
}