Pagini recente » Cod sursa (job #2490839) | Cod sursa (job #548603) | Cod sursa (job #211125) | Cod sursa (job #404188) | Cod sursa (job #10716)
Cod sursa(job #10716)
#include <stdio.h>
#define MAX(a, b) ( (a) < (b) ? (b) : (a) )
#define NMAX 151
#define TMAX 3501
#define INF 1000000001
int V[NMAX][NMAX];
int Dmin[NMAX], Used[NMAX], min, poz;
int A[TMAX][NMAX];
int Amenda[TMAX][NMAX];
int i, j, N, M, K, P;
int x, y, z, c, t, k;
int oras, time;
void printare()
{
printf("\n");
for (i = 1; i <= N; i++)
{
for (j = 0; j <= TMAX - 1; j++)
{
//scanf("%d %d", &oras, &time);
printf("%d ", A[j][i]);
}
printf("\n");
}
}
int main()
{
freopen("amenzi.in", "r", stdin);
freopen("amenzi.out", "w", stdout);
scanf("%d %d %d %d", &N, &M, &K, &P);
for (i = 1; i <= N; i++)
for (j = 1; j <= N; j++) V[i][j] = +INF;
for (i = 1; i <= M; i++)
{
scanf("%d %d %d", &x, &y, &z);
V[x][y] = z;
V[y][x] = z;
}
for (i = 1; i <= N; i++) Dmin[i] = INF;
Dmin[1] = 0, min = INF;
for (i = 1; i <= N; i++)
{
min = INF, poz = 0;
for (j = 1; j <= N; j++)
if (min > Dmin[j] && Used[j] == 0) min = Dmin[j], poz = j;
if (!poz) break;
Used[poz] = 1;
for (j = 1; j <= N; j++)
if (Dmin[poz] + V[poz][j] < Dmin[j]) Dmin[j] = Dmin[poz] + V[poz][j];
}
for (i = 1; i <= K; i++)
{
scanf("%d %d %d", &x, &y, &z);
if (Dmin[x] <= y) Amenda[y][x] = z;
}
for(t = 0; t <= TMAX - 1; t++)
for(i = 1; i <= N; i++) A[t][i] = -INF;
A[0][1] = 0;
for (t = 0; t <= TMAX - 1; t++)
{
for (j = 1; j <= N; j++)
for (i = 1; i <= N; i++)
if (V[j][i]>0)
{
c = V[j][i];
if (t-c >= 0 && (A[t-c][j] >= 0 || A[t-1][i] >= 0)) A[t][i] = MAX ( MAX (A[t-c][j], A[t-1][i]) + Amenda[t][i], A[t][i]);
}
//printare();
}
for (i = 1; i <= P; i++)
{
scanf("%d %d", &oras, &time);
printf("%d\n", A[time][oras]);
}
return 0;
}