Pagini recente » Cod sursa (job #2317692) | Cod sursa (job #2203220) | Cod sursa (job #1591878) | Cod sursa (job #3286456) | Cod sursa (job #2690800)
#include <bits/stdc++.h>
using namespace std;
const int N=155;
const int M=3505;
const int inf=(1<<30)-1;
ifstream f("amenzi.in");
ofstream g("amenzi.out");
int n,m,k,p;
int d,b,c;
int dist[N][N];
struct Infractiune{
int city,time,value;
}a[4*M],x;
int dp[M][N];
void RoyFloyd()
{
for(int k=1;k<=n;++k){
for(int i=1;i<=n;++i){
for(int j=1;j<=n;++j){
dist[i][j]=min(dist[i][j],dist[i][k]+dist[k][j]);
}
}
}
}
bool comp(Infractiune A,Infractiune B) {
if(A.time == B.time) return (A.city < B.city);
return (A.time < B.time);
}
int main()
{
for(int i=1;i<=N-5;++i) for(int j=1;j<=N-5;++j) if(i!=j) dist[i][j]=inf;
for(int i=0;i<=M-5;++i) for(int j=1;j<=N-5;++j) dp[i][j]=-inf;
f>>n>>m>>k>>p;
for(int i=1;i<=m;++i) {
f>>d>>b>>c;
dist[d][b]=dist[b][d]=c;
}
RoyFloyd();
// for(int i=1;i<=5;++i, cout<<endl) for(int j=1;j<=5;++j) cout<<dist[i][j]<<' ';
// cout<<endl<<endl;
for(int i=1;i<=k;++i) f>>a[i].city>>a[i].time>>a[i].value;
sort(a+1,a+k+1,comp);
dp[0][1]=0;
d=0;
a[0].city = 1; a[0].time=0; a[0].value = 0;
for(int i=0;i<=M-5;++i) {
for(int j=1;j<=n;++j) {
if(i)
dp[i][j]=max(dp[i][j],dp[i-1][j]);
if(a[d].city == j && a[d].time == i) {
dp[i][j]+=a[d].value;
for(int k=1;k<=n;++k) {
if(i+dist[j][k] < M) dp[i+dist[j][k]][k] = max(dp[i+dist[j][k]][k],dp[i][j]);
}
++d;
}
}
}
for(int i=0;i<=M-5;++i) for(int j=1;j<=n;++j) if(dp[i][j]<0) dp[i][j]=-1;
while(p--) {
f>>b>>c;
g<<dp[c][b]<<'\n';
}
return 0;
}