Submission #1326606

#TimeUsernameProblemLanguageResultExecution timeMemory
1326606SSKMFTravelling Merchant (APIO17_merchant)C++20
12 / 100
63 ms1788 KiB
#include <bits/stdc++.h>
using namespace std;

pair <int , int> cost[101][1001];
pair <int , int64_t> factor[101][101];
int64_t distanta[101];

inline void Solve ()
{
    int numar_noduri , numar_muchii , numar_candidati;
    cin >> numar_noduri >> numar_muchii >> numar_candidati;

    for (int nod = 1 ; nod <= numar_noduri ; nod++) {
        for (int indice = 1 ; indice <= numar_candidati ; indice++)
            { cin >> cost[nod][indice].first >> cost[nod][indice].second; }
    }

    for (int nod_1 = 1 ; nod_1 <= numar_noduri ; nod_1++) {
        for (int nod_2 = 1 ; nod_2 <= numar_noduri ; nod_2++)
        {
            factor[nod_1][nod_2].second = 1e12;
            if (nod_1 == nod_2)
                { continue; }

            for (int indice = 1 ; indice <= numar_candidati ; indice++) {
                if (cost[nod_2][indice].second != -1 && cost[nod_1][indice].first != -1)
                    { factor[nod_1][nod_2].first = max(factor[nod_1][nod_2].first , cost[nod_2][indice].second - cost[nod_1][indice].first); }
            }
        }
    }

    while (numar_muchii--)
        { int nod[2]; cin >> nod[0] >> nod[1] >> factor[nod[0]][nod[1]].second; }

    for (int intermediar = 1 ; intermediar <= numar_noduri ; intermediar++) {
        for (int nod_1 = 1 ; nod_1 <= numar_noduri ; nod_1++) {
            for (int nod_2 = 1 ; nod_2 <= numar_noduri ; nod_2++) {
                if (nod_1 != nod_2)
                    { factor[nod_1][nod_2].second = min(factor[nod_1][nod_2].second , factor[nod_1][intermediar].second + factor[intermediar][nod_2].second); }
            }
        }
    }

    for (int nod_1 = 1 ; nod_1 <= numar_noduri ; nod_1++) {
        for (int nod_2 = 1 ; nod_2 <= numar_noduri ; nod_2++) {
            if (factor[nod_1][nod_2].second == 1e12)
                { factor[nod_1][nod_2].first = 0; }
        }
    }
    
    int64_t stanga = 1 , dreapta = 1e10;
    while (stanga <= dreapta)
    {
        const int64_t mijloc = (stanga + dreapta) >> 1;
        vector < pair < pair <int , int> , int64_t > > muchii;
        for (int nod_1 = 1 ; nod_1 <= numar_noduri ; nod_1++)
        {
            distanta[nod_1] = -1e12;
            for (int nod_2 = 1 ; nod_2 <= numar_noduri ; nod_2++) {
                if (factor[nod_1][nod_2].second != 1e12)
                    { muchii.emplace_back(make_pair(nod_1 , nod_2) , factor[nod_1][nod_2].first - 1LL * mijloc * factor[nod_1][nod_2].second); }
            }
        }

        distanta[1] = 0;
        for (int ramas = numar_noduri ; ramas ; ramas--) {
            for (auto& muchie : muchii)
                { distanta[muchie.first.second] = max(distanta[muchie.first.second] , distanta[muchie.first.first] + muchie.second); }
        }

        bool gasit = false;
        for (auto& muchie : muchii) {
            if (muchie.first.second == 1 && distanta[muchie.first.first] + muchie.second >= 0)
                { gasit = true; break; }
        }

        if (gasit) { stanga = mijloc + 1; }
        else { dreapta = mijloc - 1; }
    }

    cout << dreapta;
}

int main ()
{
    ios :: sync_with_stdio(false);
    cin.tie(NULL); cout.tie(NULL);

    int numar_teste = 1;
    // cin >> numar_teste;
    while (numar_teste--)
        { Solve(); }

    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...