Cod sursa(job #9426)

Utilizator alex_damianDamian Alexandru alex_damian Data 27 ianuarie 2007 15:22:35
Problema Amenzi Scor 30
Compilator cpp Status done
Runda Unirea 2007, clasele 11-12 Marime 1.29 kb
#include <cstdio>

#define FIN "amenzi.in"
#define FOUT "amenzi.out"
#define MAXN 161
#define MAXM 1601
#define MAXP 8101
#define MAXK 12101
#define MAXT 3601
#define INF 100000

long c[MAXN][MAXN], am[MAXT][MAXN], meet[MAXP][2];
long long s[MAXT][MAXN], max;
long n, m, i, j, k, p, x, y, cost, tmaxim;


int main() {
	freopen(FIN, "r", stdin);
  freopen(FOUT, "w", stdout);
  scanf("%ld %ld %ld %ld", &n, &m, &k, &p);
  tmaxim = 0;
  for (i=1; i<=n; i++)
     for (j=1; j<=n; j++)
        c[i][j] = (i==j) ? (1) : (INF);
  for (i=1; i<=m; i++) {
     scanf("%ld %ld %ld", &x, &y, &cost);
     c[x][y] = cost;
     c[y][x] = cost;
  }
	for (i=1; i<=k; i++) {
     scanf("%ld %ld %ld", &x, &y, &cost);
     am[y][x] = cost;
     if (tmaxim<cost) tmaxim = y;
  }
	for (i=1; i<=p; i++) {
     scanf("%ld %ld", &meet[i][0], &meet[i][1]);
     if (tmaxim<meet[i][1]) tmaxim = meet[i][1];
  }
  //solve
  s[0][1] = 1;
  for (i=1; i<=tmaxim; i++) {
     for (j=1; j<=n; j++) {
        max = 0;
        for (k=1; k<=n; k++) {
           if (i>=c[k][j])
             if (s[i-c[k][j]][k] > max) max = s[i-c[k][j]][k];
        }
     		if (max) s[i][j] = max + am[i][j];
     }
  }
	//afis
  for (i=1; i<=p; i++)
     printf("%lld\n", s[meet[i][1]][meet[i][0]] - 1);
  return 0;
}