Cod sursa(job #2908181)

Utilizator lolotbogdanLolot Stefan-Bogdan lolotbogdan Data 1 iunie 2022 23:45:15
Problema Algoritmul Bellman-Ford Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.74 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>

using namespace std;

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

int n, m; // nr de noduri si muchii
vector<vector<pair<int, int>>>vecini; // liste de vecini + costul unui arc
vector<int>d; // vector in care este stocat costul minim al unui drum de la start la u, descoperit pana la acel moment
queue<int>q; // coada in care stocam varfurile cu eticheta actualizata
vector<bool>in_q;
vector<int>contor; // veriricam de cate ori a fost relaxat un varf

bool bellmanFord(int start){

    d[start] = 0;
    q.push(start);
    in_q[start] = 1;

    while(!q.empty()){

        int u = q.front();
        q.pop();
        in_q[u] = 0;

        for(int i = 0; i < vecini[u].size(); i++){

            int v = vecini[u][i].first;
            int c = vecini[u][i].second;

            if(d[v] > d[u] + c){
                d[v] = d[u] + c;

                if(in_q[v] == 0){
                    q.push(v);
                    in_q[v] = 1;
                    contor[v]++;

                    if(contor[v] >= n) // am gasit un ciclu negativ
                        return 0;
                }
            }
        }
    }
    // daca am ajuns aici => nu am ciclu negativ
    return 1;
}

int main()
{
    f >> n >> m;

    vecini.resize(n + 1);
    d.resize(n + 1, 1000000);
    in_q.resize(n + 1, 0);
    contor.resize(n + 1, 0);

    for(int i =0; i < m; i++){

        int x, y, cost;

        f >> x >> y >> cost;

        vecini[x].push_back({y, cost});
    }

    if(bellmanFord(1))
        for(int i = 2; i <= n; i++)
            g << d[i] << " ";
    else
        g <<"Ciclu negativ!";


    return 0;
}