Cod sursa(job #2437257)

Utilizator rd211Dinucu David rd211 Data 9 iulie 2019 06:39:45
Problema Algoritmul Bellman-Ford Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.4 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
#include <bitset>
using namespace std;
const int NMAX = 50050;
ifstream fin("bellmanford.in");
ofstream fout("bellmanford.out");
int n,m;
int D[NMAX];
int C[NMAX];
vector<pair<int,int>> G[NMAX];
bitset<NMAX> inCoada(false);
queue<int> coada;
int main()
{
    fin>>n>>m;
    for(int i=0; i<m; i++)
    {
        int x,y,c;
        fin>>x>>y>>c;
        G[x].push_back({y,c});
    }
    fill(D,D+n+10,1000000);
    D[1]=0,coada.push(1),inCoada[1].flip(),C[1]++;
    bool neg = false;
    while(coada.size()&&(!neg))
    {

        int j = coada.front();
        coada.pop();
        inCoada[j]=false;
        for(int i = 0; i<G[j].size(); i++)
        {
            int vecin = G[j][i].first;
            int cost  = G[j][i].second;
            if(D[vecin]>D[j]+cost)
            {
                D[vecin]=D[j]+cost;
                if(!inCoada[vecin]){
                    if(C[vecin]>n)
                        neg = true;
                    else
                    {
                        coada.push(vecin);
                        inCoada[vecin]=true;
                        C[vecin]++;
                    }
                }
            }
        }
    }
    if(neg)
        fout<<"Ciclu negativ!"<<" ";
    else
        for(int i = 2;i<=n;i++)
            fout<<D[i]<<" ";
return 0;
}