Cod sursa(job #2683784)

Utilizator SoranaAureliaCatrina Sorana SoranaAurelia Data 12 decembrie 2020 09:49:57
Problema Algoritmul Bellman-Ford Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.32 kb
#include <fstream>
#include <queue>
#include <vector>
#define NMAX 50005
#define INF 0x3f3f3f3f
using namespace std;


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

int n, m;
int dmin[NMAX], decateori[NMAX], viz[NMAX];

struct nod{
    int y, cost;
};

vector<nod>graph[NMAX];
queue<int> Q;

void init(){
    for(int i=1; i<=n; i++)
        dmin[i] = NMAX*1000;
}

void citire(){
    f>>n>>m;
    int x, y, cost;
    for(int i=0; i<m; i++){
        f>>x>>y>>cost;
        graph[x].push_back({y, cost});
    }
}

void bellman_ford(int vf){
    Q.push(vf);
    viz[vf] = 1;
    dmin[vf] = 0;

    while(!Q.empty()){
        int v = Q.front();
        Q.pop();
        viz[v] = 0;
        for(auto &el:graph[v])
            if(dmin[el.y] > dmin[v] + el.cost){
                dmin[el.y] = dmin[v] + el.cost;
                if(viz[el.y] == 0)
                    Q.push(el.y);
                viz[el.y] = 1;
                decateori[el.y]++;
                if(decateori[el.y] > n){
                    g<<"Ciclu negativ!";
                    exit(0);
                }
            }
    }

}

void afisare(){
    for(int i=2; i<=n; i++)
        g<<dmin[i]<<" ";
}


int main()
{
    citire();
    init();
    bellman_ford(1);
    afisare();
    return 0;
}