Pagini recente » Cod sursa (job #2969783) | Cod sursa (job #3148574) | Cod sursa (job #474838) | Cod sursa (job #3203050) | Cod sursa (job #263658)
Cod sursa(job #263658)
#include <cstdio>
int N, M, K, P, C[3505][155], a[155][155], am[3505][155];
typedef struct nod
{
int x, c;
nod *a;
} *pNod;
pNod v[155];
void add(int x, int y)
{
pNod q = new nod;
q -> x = y;
q -> a = v[x];
v[x] = q;
}
int max(int x, int y) { return x > y ? x : y;}
void init()
{
int i, j;
for (i = 0; i <= 3500; i++)
for (j = 1; j <= N; j++) C[i][j] = -1;
}
int main()
{
freopen("amenzi.in","r",stdin);
freopen("amenzi.out","w",stdout);
int i, j, x, y, c;
scanf("%d %d %d %d", &N, &M, &K, &P);
for (i = 1; i <= M; i++)
{
scanf("%d %d %d", &x, &y, &c);
a[x][y] = a[y][x] = c;
add(x, y); add(y, x);
}
init();
for (i = 1; i <= K; i++)
{
scanf("%d %d %d", &x, &y, &c);
am[y][x] = c;
}
C[0][1] = 0;
for (i = 0; i <= 3500; i++)
{
for (j = 1; j <= N; j++)
if (C[i][j] != -1)
{
C[i][j] += am[i][j];
C[i + 1][j] = max(C[i][j], C[i + 1][j]);
for (pNod q = v[j]; q != NULL; q = q -> a)
if (i + a[j][q -> x] <= 3500)
C[i + a[j][q -> x]][q -> x] = max(C[i][j], C[i + a[j][q->x]][q ->x]);
// printf("%d ",C[i][j]);
}
//printf("\n");
}
for (i = 1; i <= P; i++)
{
scanf("%d %d", &x, &y);
printf("%d\n", C[y][x]);
}
return 0;
}