Cod sursa(job #3281358)

Utilizator stanciuvalentinStanciu-Tivlea Valentin Gabriel stanciuvalentin Data 1 martie 2025 10:59:05
Problema Amenzi Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.24 kb
#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;
}