Pagini recente » Profil cezar_titianu | soldiers | Cod sursa (job #3290950) | Statistici isaIoana Manea (iomanea2002) | Cod sursa (job #2690767)
#include <bits/stdc++.h>
using namespace std;
const int N=155;
const int K=12005;
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[K],x;
vector<Infractiune>dp[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) {
return (A.time < B.time);
}
int getMaxLast(Infractiune a,bool ok) {
int mx = -1;
int lt,rt,md,dt;
for(int i=1;i<=n;++i) {
lt=-1;
rt = dp[i].size();
dt = dist[a.city][i];
while(rt - lt != 1) {
md = (lt+rt)/2;
if(dp[i][md].time + dt <= a.time) lt = md;
else rt = md;
}
if(lt >= 0) mx = max(mx,dp[i][lt].value);
}
if(mx >= 0 && ok) {
a.value+=mx;
dp[a.city].push_back(a);
}
if(mx < 0) mx = 0;
return mx;
}
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;
x.city = 1; x.time =0; x.value = 0;
dp[1].push_back(x);
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);
for(int i=1;i<=k;++i) getMaxLast(a[i],1);
for(int i=1;i<=p;++i) {
f>>x.city>>x.time;
g<<getMaxLast(x,0)<<'\n';
}
// for(int i=1;i<=n;++i) {
// for(int j=0;j<dp[i].size();++j) {
// cout<<dp[i][j].time<<' '<<dp[i][j].value<<endl;
// }
// cout<<endl;
// }
return 0;
}