Pagini recente » Cod sursa (job #657582) | Cod sursa (job #73246) | Cod sursa (job #69949) | Cod sursa (job #2103011) | Cod sursa (job #263891)
Cod sursa(job #263891)
#include <cstdio>
int N, M, K, P, C[3505][155], a[155][155], am[3505][155], tmax;
typedef struct nod
{
int x, c;
nod *a;
} *pNod;
pNod v[155];
struct que
{
int x, y;
};
que qq[11005];
void add(int x, int y)
{
pNod q = new nod;
q -> x = y;
q -> a = v[x];
v[x] = q;
}
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);
}
for (i = 1; i <= K; i++)
{
scanf("%d %d %d", &x, &y, &c);
am[y][x] += c;
if (y > tmax) tmax = y;
}
for (i = 1; i <= P; i++)
{
scanf("%d %d", &qq[i].x, &qq[i].y);
if (qq[i].y > tmax) tmax = qq[i].y;
}
for (i = 0; i <= tmax; i++)
for (j = 1; j <= N; j++) C[i][j] = -1;
C[0][1] = 0;
for (i = 0; i <= tmax; i++)
{
for (j = 1; j <= N; j++)
{
if (C[i][j] != -1)
{
C[i][j] += am[i][j];
if (C[i][j] > C[i + 1][j]) C[i + 1][j] = C[i][j];
for (pNod q = v[j]; q != NULL; q = q -> a)
if (i + a[j][q -> x] <= tmax && C[i][j] > C[i + a[i][q ->x]][q->x]) C[i + a[j][q -> x]][q -> x] = C[i][j];
}
// printf("%6d ",C[i][j]);
}
// printf("\n");
}
for (i = 1; i <= P; i++)
printf("%d\n", C[qq[i].y][qq[i].x]);
return 0;
}