Pagini recente » Cod sursa (job #954451) | Cod sursa (job #2643452) | Cod sursa (job #1356081) | Cod sursa (job #2798067) | Cod sursa (job #1942377)
#include <bits/stdc++.h>
#define MAXN 151
#define MAXT 3501
#define MAXQ 8001
#define INF 0x3f3f3f3f
using namespace std;
vector <pair <int, int> > G[MAXN];
pair <int, int> query[MAXQ];
int n, m, k, p, maxT, d[MAXN][MAXT], value[MAXN][MAXT];
bool seen[MAXN];
void dfs(int node)
{
int son, i;
seen[node] = 1;
for(i=0; i<G[node].size(); ++i) {
son = G[node][i].first;
if(!seen[son])
dfs(son);
}
}
inline void computeBest(int time)
{
int i, son, node, cost;
for(node=1; node<=n; ++node) {
if(!seen[node]) continue;
if(d[node][time-1] != -INF)
d[node][time] = d[node][time-1] + value[node][time];
for(i=0; i<G[node].size(); ++i) {
son = G[node][i].first;
cost = G[node][i].second;
if(time - cost < 0) continue;
if(d[son][time-cost] == -INF) continue;
d[node][time] = max(d[node][time], d[son][time-cost] + value[node][time]);
}
}
}
int main()
{
freopen("amenzi.in", "r", stdin);
freopen("amenzi.out", "w", stdout);
int x, y, z, i, j;
scanf("%d%d%d%d", &n, &m, &k, &p);
for(i=1; i<=m; ++i) {
scanf("%d%d%d", &x, &y, &z);
G[x].push_back({y, z});
G[y].push_back({x, z});
}
for(i=1; i<=k; ++i) {
scanf("%d%d%d", &x, &y, &z);
value[x][y] = z;
}
for(i=1; i<=p; ++i) {
scanf("%d%d", &query[i].first, &query[i].second);
maxT = max(maxT, query[i].second);
}
for(i=1; i<=n; ++i)
for(j=0; j<=maxT; ++j)
d[i][j] = -INF;
d[1][0] = 0;
dfs(1);
for(i=1; i<=maxT; ++i)
computeBest(i);
for(i=1; i<=p; ++i) {
x = query[i].first;
y = query[i].second;
if(!seen[x]) printf("-1\n");
else printf("%d\n", d[x][y]);
}
return 0;
}