Pagini recente » Cod sursa (job #1157549) | Cod sursa (job #163550) | Cod sursa (job #1288949) | Cod sursa (job #2124656) | Cod sursa (job #9549)
Cod sursa(job #9549)
#include <cstdio>
#include <vector>
#include <queue>
using namespace std;
#define MAXN 155
#define MAXT 3505
int N, M, K, P;
vector< pair<int, int> > con[MAXN];
int TMAX = -1;
char used[MAXN][MAXT];
short infrac[MAXN][MAXT];
int best[MAXN][MAXT];
vector< pair<int, int> > query;
queue< pair<int, int> > Q;
int main()
{
freopen("amenzi.in", "rt", stdin);
freopen("amenzi.out", "wt", stdout);
scanf("%d %d %d %d", &N, &M, &K, &P);
for (; M; M--)
{
int i, j, k;
scanf("%d %d %d", &i, &j, &k);
con[i].push_back( make_pair(j, k) );
con[j].push_back( make_pair(i, k) );
if (k > TMAX)
TMAX = k;
}
for (; K; K--)
{
int i, j, k;
scanf("%d %d %d", &i, &j, &k);
infrac[i][j] += (short)k;
}
for (int k = 0; k < P; k++)
{
int i, j;
scanf("%d %d", &i, &j);
if (j > TMAX)
TMAX = j;
query.push_back( make_pair(i, j) );
}
for (Q.push( make_pair(1, 0) ); !Q.empty(); Q.pop())
{
int cur = Q.front().first, T = Q.front().second, C = best[cur][T];
int _cur, _T, _C;
if (T + 1 <= TMAX)
{
_cur = cur;
_T = T + 1;
_C = C + infrac[_cur][_T];
if (_C > best[_cur][_T])
{
best[_cur][_T] = _C;
if (!used[_cur][_T])
{
Q.push( make_pair( _cur, _T ) );
used[_cur][_T] = 1;
}
}
}
vector< pair<int, int> > :: iterator it;
for (it = con[cur].begin(); it != con[cur].end(); it++)
{
_cur = (*it).first;
_T = T + (*it).second;
if (_T > TMAX)
continue;
_C = C + infrac[_cur][_T];
if (_C > best[_cur][_T])
{
best[_cur][_T] = _C;
if (!used[_cur][_T])
{
Q.push( make_pair( _cur, _T ) );
used[_cur][_T] = 1;
}
}
}
used[cur][T] = 0;
}
for (int i = 0; i < P; i++)
printf("%d\n", best[ query[i].first ][ query[i].second ]);
return 0;
}