Pagini recente » Cod sursa (job #1493125) | Cod sursa (job #1192417) | Cod sursa (job #2123435) | Cod sursa (job #450430) | Cod sursa (job #9954)
Cod sursa(job #9954)
#include <cstdio>
#include <vector>
#include <algorithm>
#define infinite 1000000000
#define nmax 155
#define mmax 1505
#define kmax 12005
#define pmax 8005
#define tmax 3005
using namespace std;
int cst[nmax][nmax],c1[nmax][tmax],n,m,k,p,c[nmax][tmax];
vector <int> e[nmax];
int main() {
freopen("amenzi.in","r",stdin);
freopen("amenzi.out","w",stdout);
scanf("%d %d %d %d\n",&n,&m,&k,&p);
int n1,n2,t1;
for(int i = 1; i <= n; i++)
e[i].push_back(i);
for(int i = 1; i <= m; i++) {
scanf("%d %d %d\n",&n1,&n2,&t1);
e[n1].push_back(n2);
e[n2].push_back(n1);
cst[n1][n2] = t1;
cst[n2][n1] = t1;
}
int tiempo,costo;
for(int i = 1; i <= k; i++) {
scanf("%d %d %d\n",&n1,&tiempo,&costo);
c1[n1][tiempo] += costo;
}
for(int i = 1; i <= n; i++)
for(int j = 0; j < tmax; j++) c[i][j] = -infinite;
c[1][0] = c1[1][0];
for(int j = 0; j < tmax; j++)
for(int i = 1; i <= n; i++) {
if(c[i][j] == -infinite) c[i][j] = c[i][j-1];
for(int k = 0; k < e[i].size(); k++) {
int dn = e[i][k];
if(j - cst[i][dn] >= 0)
if(c[dn][j - cst[i][dn]] != -infinite)
if(c[dn][j - cst[i][dn]] + c1[i][j] > c[i][j]) c[i][j] = c[dn][j - cst[i][dn]] + c1[i][j];
}
}
int nn1,pp1;
for(int i = 1; i <= p; i++) {
scanf("%d %d\n",&nn1,&pp1);
printf("%d\n",max(c[nn1][pp1],-1));
}
return 0;
}