Pagini recente » o_ultima_simulare_inainte_de_oji | Cod sursa (job #577806) | Cod sursa (job #3194431) | Cod sursa (job #1923459) | Cod sursa (job #2690817)
#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];
int a[M][N],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]);
}
}
}
}
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;++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>>b>>c>>d;
a[c][b]+=d;
}
for(int i=0;i<M;++i) for(int j=1;j<=n;++j) if(a[i][j]==0) a[i][j]=-1;
//for(int i=0;i<=20;++i,cout<<endl) for(int j=1;j<=n;++j) cout<<a[i][j]<<' '; cout<<endl;
dp[0][1]=0; a[0][1]=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[i][j]>=0) {
dp[i][j]+=a[i][j];
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]);
}
}
}
}
for(int i=0;i<=M-5;++i) for(int j=1;j<=n;++j) if(dp[i][j]<0) dp[i][j]=-1;
//for(int i=0;i<=20;++i,cout<<endl) for(int j=1;j<=n;++j) cout<<dp[i][j]<<' ';
while(p--) {
f>>b>>c;
g<<dp[c][b]<<'\n';
}
return 0;
}