Pagini recente » Cod sursa (job #2323835) | Cod sursa (job #613178) | Cod sursa (job #3261763) | Cod sursa (job #373317) | Cod sursa (job #2467058)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("amenzi.in");
ofstream fout("amenzi.out");
const int DMAX=155;
const int TMAX=3505;
struct nume{
int node,cost;
};
vector <nume> V[DMAX];
int dp[TMAX][DMAX];
bool sepoate[TMAX][DMAX];
int n,m,k,p;
inline bool operator<(nume x,nume y){
return x.cost>y.cost;
}
inline int maxim(int x,int y){
if(x>y)
return x;
return y;
}
int main(){
int i,j;
int x,y,c,val;
fin>>n>>m>>k>>p;
for(i=1;i<=m;i++){
fin>>x>>y>>c;
V[x].push_back({y,c});
V[y].push_back({x,c});
}
for(i=1;i<=k;i++){
fin>>x>>y>>c;
dp[y][x]+=c;
}
sepoate[0][1]=true;
for(i=1;i<=3500;i++)
for(j=1;j<=n;j++){
val=-INT_MAX/2;
for(auto& ii:V[j])
if(i-ii.cost>=0 && sepoate[i-ii.cost][ii.node])
val=maxim(val,dp[i-ii.cost][ii.node]);
bool ok=false;
if(val != -INT_MAX/2){
sepoate[i][j]=true;
if(sepoate[i-1][j])
dp[i][j]+=maxim(val,dp[i-1][j]);
else
dp[i][j]+=val;
ok=true;
}
if(sepoate[i-1][j]){
sepoate[i][j]=true;
if(!ok)
dp[i][j]+=dp[i-1][j];
}
}
for(i=1;i<=p;i++){
fin>>x>>y;
if(sepoate[y][x])
fout<<dp[y][x]<<'\n';
else
fout<<"-1\n";
}
return 0;
}