Cod sursa(job #11655)

Utilizator DorinOltean Dorin Dorin Data 1 februarie 2007 08:17:51
Problema Amenzi Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.23 kb
# include <stdio.h>

# define input "amenzi.in"
# define output "amenzi.out"

# define maxN 151
# define maxtimp 7503
# define max 8001
# define maxM  1501


long n,m,k,p,cost;
long x,y,c,C[maxtimp][maxN],s[maxtimp][maxN],tmax,i,j,val;
/*struct kt
{
       long nod,cost;
}drum[maxN][maxM];
*/
struct kkt
{
	long x,y;
}sir[max];

struct lista
{
       long nod,cost;
       lista *next;
}*g[maxN],*f;

void adauga(long x,long y,long cost)
{
	 lista *fc = new lista;
	 fc->cost = cost;
	 fc->nod = y;
	 fc->next = g[x];
	 g[x] = fc;

	 fc = new lista;

	 fc->cost = cost;
	 fc->nod = x;
	 fc->next = g[y];
	 g[y] = fc;
}

int main()
{
	freopen(input,"r",stdin);
	freopen(output,"w",stdout);

	scanf("%ld%ld%ld%ld",&n,&m,&k,&p);

	for(i = 1;i<=m;i++)
	{
		scanf("%ld%ld%ld",&x,&y,&c);
/*		drum[x][++drum[x][0].nod].nod = y;
		drum[x][drum[x][0].nod].cost = c;

        drum[y][++drum[y][0].nod].nod = x;
		drum[y][drum[y][0].nod].cost = c;
*/
		adauga(x,y,c);
    }
    for(i = 1;i<=k;i++)
    {
          scanf("%ld%ld%ld",&x,&y,&cost);
          s[y][x] += cost;
          if(y > tmax)
		  tmax = y;
	}

	for(i = 2;i<=n;i++)
		C[0][i] = -1;

/*	for(i = 1;i<=tmax;i++)
	{
		for(j = 1;j<=n;j++)
			if(!s[i][j] && !C[i][j])
				s[i][j] = -INF;
	}          */


	for(i = 1;i<=p;i++)
    {
          scanf("%ld%ld",&x,&y);
		  sir[i].x = x;
		  sir[i].y = y;
		  if(y > tmax)
			tmax = y;
	}


	for(i = 1;i<=tmax;i++)
	{
		  for(j = 1;j<=n;j++)
		  {
				C[i][j] = C[i-1][j];
				f = g[j];
				//k = drum[j][0].nod;
				while(f)
				{
					x = f->nod;
					c = f->cost;
				/*	x = drum[j][k].nod;
					c = drum[j][k].cost;*/
					if(i >= c)
					{
						 if(C[i-c][x] > C[i][j])
							C[i][j] = C[i-c][x];
						 val = C[i-c][x];
					}
				/*	if(val == -1 && j > 1 && !C[i][j])
						C[i][j] = -1;*/

                    
					f=f->next;
				}
/*				if(C[i-1][j] > C[i][j])
					C[i][j] = C[i-1][j];
*/
				if(C[i][j]!=-1)
					C[i][j] += s[i][j];
		  }
	}
	  /*
	for(i= 1;i<=tmax;i++)
	{
		for(j = 1;j<=n;j++)
			printf("%ld ",C[i][j]);
		printf("\n");
	}
		*/
	for(i = 1;i<=p;i++)
	{
		  printf("%ld\n",C[sir[i].y][sir[i].x]);
	}

	return 0;
}