Cod sursa(job #2940872)

Utilizator mihneagherghelMihnea Gherghel-Butan mihneagherghel Data 16 noiembrie 2022 18:15:57
Problema A+B Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.43 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
#define infinit 100000000
using namespace std;

ifstream fin("ciclu.in");
ofstream fout("ciclu.out");
int n, m;
vector<vector<pair<int,int>>> listaAdiacenta;
// citire muchii, crearea listei de adiacenta, determinarea costului maxim
void citire()
{
    fin >> n >> m;
    listaAdiacenta = vector<vector<pair<int,int>>>(n+1, vector<pair<int,int>>(0));
    for (int i = 0; i < m; i++)
    {
        int a, b, c; fin >> a >> b >> c;
        c = c * 100;
        listaAdiacenta[a].push_back(make_pair(b,c));
    }
}
bool cicluNegativ(int mij)
{
    vector<int> nrSchimbari = vector<int>(n+1, 0);
    vector<bool> inCiclu = vector<bool>(n+1, false);
    vector<long long> distanta = vector<long long>(n+1,infinit);
    for (int i = 1; i <= n; i++)
    {
        if (distanta[i] == infinit)
        {
            queue<int> coada;
            coada.push(i);
            distanta[i] = 0;
            nrSchimbari[i] = 1;
            inCiclu[i] = true;
            while (coada.empty()==false)
            {
                int nod = coada.front();
                coada.pop();
                inCiclu[nod] = false;
                for (auto elem : listaAdiacenta[nod])
                {
                    if (distanta[elem.first] > distanta[nod] + elem.second-mij)
                    {
                        distanta[elem.first] = distanta[nod] + elem.second-mij;
                        if (inCiclu[elem.first] == false)
                        {
                            inCiclu[elem.first] = true;
                            ++nrSchimbari[elem.first];
                            if (nrSchimbari[elem.first] >= n)
                            {
                                return true;
                            }
                            coada.push(elem.first);
                        }
                    }
                }
            }
        }
    }
    return false;
}

int cautareBinara()
{
    int solutie = 0;
    int left = 0, right = 4000001;
    while (left <= right)
    {
        int mij = (left + right) / 2;
        if (cicluNegativ(mij) == false)
        {
            left = mij + 1;
        }
        else
        {
            right = mij - 1;
            solutie = mij;
        }
    }
    return solutie;
}


int main()
{
    citire();
    fout << (1.0 * cautareBinara() / 100);
}