Pagini recente » Cod sursa (job #543840) | Cod sursa (job #171684) | Documentatie | Premiile preONI 2006 | Cod sursa (job #9871)
Cod sursa(job #9871)
#include <cstdio>
#include <algorithm>
#include <vector>
using namespace std;
#define pb push_back
#define sz size()
#define inf 1000000000 //un miliard
#define Nmax 155
#define Tmax 3505
#define Kmax 12005
#define Pmax 8005
struct infr
{
int nod, timp, val;
} A[Kmax], B[Pmax];
int n, m, K, p;
int c[Nmax][Nmax];
int v[Tmax][Nmax];
vector<int> vec[Nmax];
void readdata()
{
freopen("amenzi.in", "r", stdin);
freopen("amenzi.out", "w", stdout);
int i, j, a, b, val;
scanf("%d %d %d %d", &n, &m, &K, &p);
for (i = 1; i <= n; ++i)
for (j = 1; j <= n; ++j)
c[i][j] = inf;
for (i = 0; i < m; ++i)
{
scanf("%d %d %d", &a, &b, &val);
c[a][b] = min(c[a][b], val);
c[b][a] = min(c[b][a], val);
}
for (i = 0; i < K; ++i)
scanf("%d %d %d", &A[i].nod, &A[i].timp, &A[i].val);
for (i = 0; i < p; ++i)
scanf("%d %d", &B[i].nod, &B[i].timp);
}
int cmp(struct infr a, struct infr b)
{
return a.timp < b.timp;
}
void solve()
{
int i, j, k, nod, ia = 0, val;
sort(A, A+K, cmp);
v[0][1] = 0;
for (i = 2; i <= n; ++i)
v[0][i] = -1;
while (ia < K && A[ia].timp == 0)
{
if (v[0][ A[ia].nod ] >-1) v[0][ A[ia].nod ] += A[ia].val;
++ia;
}
for (i = 1; i <= n; ++i)
for (j = 1; j <= n; ++j)
if (c[i][j] < inf) vec[i].pb(j);
for (k = 1; k <= 3500; ++k)
{
for (i = 1; i <= n; ++i)
v[k][i] = v[k-1][i];
for (i = 1; i <= n; ++i)
for (j = 0; j < vec[i].sz; ++j)
{
nod = vec[i][j];
if (k-c[i][nod] >= 0 && v[ k-c[i][nod] ][nod] > -1)
v[k][i] = max(v[ k-c[i][nod] ][nod], v[k][i]);
}
while (ia < K && A[ia].timp == k)
{
if (v[k][ A[ia].nod ] > -1) v[k][ A[ia].nod ] += A[ia].val;
++ia;
}
}
for (i = 0; i < p; ++i)
{
val = v[ B[i].timp ][ B[i].nod ];
printf("%d\n", val);
}
}
int main()
{
readdata();
solve();
return 0;
}