Pagini recente » Cod sursa (job #2824666) | Cod sursa (job #125942) | Cod sursa (job #1013) | Cod sursa (job #1028582) | Cod sursa (job #9636)
Cod sursa(job #9636)
#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;
}