Pagini recente » Cod sursa (job #1321624) | Cod sursa (job #151287) | Cod sursa (job #3292736) | Cod sursa (job #267724) | Cod sursa (job #3281358)
#include <bits/stdc++.h>
using namespace std;
ifstream f("amenzi.in");
ofstream g("amenzi.out");
struct drumuri{
int node,timp,amenda;
};
struct ceva{
int node,timp;
};
struct compare{
bool operator()(drumuri a,drumuri b){
if(a.timp==b.timp)
a.amenda<b.amenda;
return a.timp>b.timp;
}
};
struct amenzile{
int timp,amenda;
};
int n,m,k,p,x,y,z,t,drum[200][3600];
vector <ceva> edges[200];
vector <amenzile> amenzi[200];
priority_queue <drumuri, vector<drumuri>, compare> pq;
void dijkstra()
{
pq.push({1,0,0});
while(!pq.empty())
{
drumuri x=pq.top(); pq.pop();
// cout<<x.node<<' '<<x.timp<<' '<<x.amenda<<" "<<drum[x.node][x.timp]<<'\n';
for(auto y:edges[x.node])
{
if(x.timp+y.timp<=3500)
{
bool ok=1;
for(int t=0; t<=x.timp+y.timp; t++)
if(drum[y.node][t]>=x.amenda)
{ok=0; break;}
for(auto a:amenzi[y.node])
{
if(x.timp+y.timp<=a.timp)
{
if(x.amenda+a.amenda>drum[y.node][a.timp])
drum[y.node][a.timp]=x.amenda+a.amenda, pq.push({y.node, a.timp, x.amenda+a.amenda});
else
break;
}
if(x.timp+y.timp==a.timp)
ok=0;
}
if(ok==1)
drum[y.node][x.timp+y.timp]=x.amenda, pq.push({y.node, x.timp+y.timp, x.amenda});
}
}
}
}
bool cand(amenzile a,amenzile b){
return a.timp<b.timp;
}
int main()
{
f>>n>>m>>k>>p;
for(int i=1; i<=m; i++)
f>>x>>y>>z, edges[x].push_back({y,z}), edges[y].push_back({x,z});
for(int i=1; i<=k; i++)
f>>x>>t>>z, amenzi[x].push_back({t,z});
for(int i=1; i<=n; i++)
sort(amenzi[i].begin(),amenzi[i].end(),cand);
dijkstra();
for(int i=1; i<=p; i++)
{
f>>x>>t;
int maxim=0;
for(int j=0; j<=t; j++)
maxim=max(maxim,drum[x][j]);
g<<maxim<<'\n';
}
return 0;
}