Cod sursa(job #2425836)

Utilizator mariusilieMarius Ilie mariusilie Data 25 mai 2019 08:05:44
Problema Algoritmul Bellman-Ford Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.5 kb
#include <iostream>
#include <fstream>
#include <queue>
#include <limits.h>
#define NLIM 50001
#define MLIM 250001

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



int n, m, dis[NLIM], viz[NLIM], inCoada[NLIM];
queue<int> Coada;
vector< pair<int, int> > Muchii[MLIM];

bool BellmanFord(int start) {
    dis[start] = 0;
    Coada.push(start);
    inCoada[start] = 1;

    while(!Coada.empty()) {
        int nod = Coada.front();
        Coada.pop();
        inCoada[nod] = 0;

        for(int i=0; i<Muchii[nod].size(); i++) {
            int v = Muchii[nod][i].first;
            int c = Muchii[nod][i].second;
            if(dis[nod]+c < dis[v]) {
                dis[v] = dis[nod]+c;
                if(!inCoada[v]) {
                    viz[v]++;
                    if(viz[v] >= n)
                        return 0;
                    Coada.push(v);
                    inCoada[v] = 1;
                }
            }
        }
    }
    return 1;
}



void citire() {
    f >> n >> m;
    for(int i=1; i<=n; i++) {
        dis[i] = INT_MAX;
        viz[i] = 0;
        inCoada[i] = 0;
    }
    for(int i=1; i<=m; i++) {
        int s, d, c;
        f >> s >> d >> c;
        Muchii[s].push_back(make_pair(d, c));
    }
}
void afisare(bool state) {
    if(!state)
        g << "Ciclu negativ!";
    else for (int i = 2; i <= n; ++i)
            if(dis[i] != INT_MAX)
                g << dis[i] << ' ';
    g << '\n';
}
int main() {
    citire();
    afisare(BellmanFord(1));
    return 0;
}