Cod sursa(job #9636)

Utilizator unholyfrozenCostea Andrei unholyfrozen Data 27 ianuarie 2007 16:30:09
Problema Amenzi Scor 30
Compilator cpp Status done
Runda Unirea 2007, clasele 11-12 Marime 2.25 kb
#include<stdio.h>
#include<stdlib.h>

#define NMAX 151
#define KMAX 12001
#define MMAX 3510
#define INF 999999999
#define nd(a) (*(t_p *)(a))

typedef struct
{
	int x, y, c;
}t_p;

int cmp(const void *a, const void *b);
void read();

int N, C[NMAX][NMAX], K, V[NMAX][MMAX], pd[KMAX];
t_p P[KMAX];

int main()
{
	freopen("amenzi.in", "r", stdin);
     freopen("amenzi.out", "w", stdout);

     read();
	return 0;
}

void read()
{
	int i, M, a, b, c, j, k, pp;
     
	scanf("%d%d%d%d", &N, &M, &K, &pp);

     for(i = 0; i < N; i++)
     for(j = 0; j < N; j++)
     if(i != j)
	C[i][j] = INF;
     
     for(i = 0; i < M; i++)
	{
     	scanf("%d%d%d", &a, &b, &c);
          a--, b--;
          if(c < C[a][b]) C[a][b] = c, C[b][a] = c;
     }
     P[0].x = 0, P[0].y = 0, P[0].c = 0;
     
     for(i = 1; i <= K; i++)
     {
     scanf("%d%d%d", &P[i].x, &P[i].y, &P[i].c);
     P[i].x--;
     }
     qsort(P + 1, K, sizeof(t_p), cmp);

     for(k = 0; k < N; k++)
     for(i = 0; i < N; i++)
     for(j = 0; j < N; j++)
     if(C[i][j] > C[i][k] + C[k][j])
     C[i][j] = C[i][k] + C[k][j];

     for(i = 0; i < N; i++)
     for(j = 0; j <= 3500; j++)
     V[i][j] = -1;
     
     for(i = 0; i < N; i++)
     for(k = 0; k <= K; k++)
    	if(i == P[k].x)
     V[i][P[k].y] = k;

     for(i = 0; i < N; i++)
     for(j = 0; j <= 3500; j++)
     if(V[i][j] == -1 && j)
     V[i][j] = V[i][j - 1];

     pd[0] = 0;
	for(i = 1; i <= K; i++)
     for(j = 0; j < N; j++)
     if(P[i].x != j)
     if(P[i].y - C[P[i].x][j] >= 0 && V[j][P[i].y - C[P[i].x][j]] != -1)
	pd[i] = pd[i] < pd[V[j][P[i].y - C[P[i].x][j]]] + P[i].c ? pd[V[j][P[i].y - C[P[i].x][j]]] + P[i].c : pd[i];
     else;
     else if(P[i].y && V[j][P[i].y - 1] != -1)
     	pd[i] = pd[i] > pd[V[j][P[i].y - 1]] + P[i].c ? pd[i] : pd[V[j][P[i].y - 1]] + P[i].c;
          else;

     int rez;
     for(;pp--;)
     {
     	scanf("%d%d", &a, &b);
          a--;
          rez = 0;
        	for(i = 0; i < N; i++)
          if(b - C[a][i] >= 0 && V[i][b - C[a][i]] != -1)
		rez = rez > pd[V[i][b - C[a][i]]] ? rez : pd[V[i][b - C[a][i]]];
          printf("%d\n", rez);
     }
}

int cmp(const void *a, const void *b)
{
	return nd(a).y - nd(b).y;
}