Cod sursa(job #2513254)

Utilizator victorv88Veltan Victor victorv88 Data 22 decembrie 2019 18:20:40
Problema Amenzi Scor 20
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.27 kb
#include <bits/stdc++.h>

using namespace std;

ifstream f ("amenzi.in");
ofstream g ("amenzi.out");

vector<pair<int,int> >graph[155];

struct amenda{
    int nod, timp, cost;
};

vector<amenda>amenzi;

int n, m, k, p, from, to, cost, valmax[12005], nod, timp;
int dp[155][155];

void rf()
{
    for (int k=1; k<=n; ++k)
    {
        for (int i=1; i<=n; ++i)
        {
            for (int j=1; j<=n; ++j)
            {
                dp[i][j]=min(dp[i][j],dp[i][k]+dp[k][j]);
            }
        }
    }
}

class cmp{
public:
    bool operator()(amenda a, amenda b)
    {
        if (a.timp==b.timp)
            return a.cost<b.cost;
        return a.timp<b.timp;
    }
};

void citire()
{
    f >> n >> m >> k >> p;
    for (int i=1; i<=n; ++i)
        for (int j=1; j<=n; ++j)
            {
                if (i==j)
                    continue;
                dp[i][j]=0x3f3f3f3f;
            }
    for (int i=1; i<=m; ++i)
    {
        f >> from >> to >> cost;
        graph[from].push_back({to,cost});
        graph[to].push_back({from,cost});
        dp[from][to]=cost;
        dp[to][from]=cost;
    }
    rf();
    for (int i=1; i<=k; ++i)
    {
        f >> from >> to >> cost;
        amenzi.push_back({from,to,cost});
    }
    sort(amenzi.begin(),amenzi.end(),cmp());
}

void create_dp_amenda()
{
//    for (int i=1; i<=n; ++i)
//    {
//        for (int j=1; j<=n; ++j)
//            cout << dp[i][j] <<' ';
//        cout << '\n';
//    }
    for (int i=0; i<k; ++i)
    {
        if (dp[1][amenzi[i].nod]<=amenzi[i].timp)
            valmax[i]=amenzi[i].cost;
        for (int j=i-1; j>=0; --j)
        {
            if (amenzi[j].timp+dp[amenzi[j].nod][amenzi[i].nod]<=amenzi[i].timp)
            {
                valmax[i]=max(valmax[i],valmax[j]+amenzi[i].cost);
            }
        }
    }
}

void solve()
{
    int maxi;
    for (int test=1; test<=p; ++test)
    {
        f >> nod >> timp;
        maxi=-1;
        for (int i=0; i<k; ++i)
        {
            if (dp[nod][amenzi[i].nod]<=timp-amenzi[i].timp)
                maxi=max(maxi,valmax[i]);
        }
        g << maxi << '\n';
    }
}

int main()
{
    citire();
    create_dp_amenda();
    solve();
    return 0;
}