Cod sursa(job #2098732)

Utilizator vlad6001Pintilie Vlad vlad6001 Data 3 ianuarie 2018 14:23:50
Problema Algoritmul Bellman-Ford Scor 20
Compilator cpp Status done
Runda Arhiva educationala Marime 1.49 kb
#include <fstream>
#include <vector>
#include <queue>
#define INF 10000000000000
using namespace std;

ifstream cin("bellmanford.in");
ofstream cout("bellmanford.out");

int noduri, muchii, a, b, c, nod, dist[50004], inq[50004], vasea[50004];

struct Vecin
{
    int nod, cost;
}drum;
vector <Vecin> vec[50004];
queue <int> lista;

int main()
{
    cin >> noduri >> muchii;
    for(int i=1; i <= muchii; i++)
    {
        cin >> a >> b >> c;
        vec[a].push_back({b,c});
    }
    for(int i=1; i <= noduri; i++)
    dist[i] = INF;
    dist[1] = 0;

    lista.push(1);

    while(lista.empty() == false)
    {
        nod = lista.front();
        lista.pop();
        inq[nod] = 0;
        vasea[nod]++;

        for(int i=0; i < vec[nod].size(); i++)
        {
            drum = vec[nod][i];
            if(inq[drum.nod] == 0)
            {
                if(dist[drum.nod] > dist[nod]+drum.cost)
                {
                    if(vasea[drum.nod] == noduri)
                    {
                        cout << "Ciclu negativ!";
                        return 0;
                    }
                    dist[drum.nod] = dist[nod]+drum.cost;
                    if(inq[drum.nod] == 0)
                    {
                        inq[drum.nod] = 1;
                        lista.push(drum.nod);
                    }
                }
            }
        }
    }
    for(int i=2; i <= noduri; i++)
    {
        cout << dist[i] << ' ';
    }
}