Cod sursa(job #2549558)

Utilizator SoranaAureliaCatrina Sorana SoranaAurelia Data 17 februarie 2020 19:51:22
Problema Algoritmul Bellman-Ford Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.31 kb
#define NMAX 50005
#define INF 0x3f3f3f3f
#include <fstream>
#include <vector>
#include <queue>
#include <cstdlib>
using namespace std;

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

struct nod{
    int y;
    int cost;
};

int n, m, x, y, c;
int viz[NMAX],decateori[NMAX];
int dmin[NMAX];


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

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

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

void afisare(){
    for(int i=2; i<=n; i++)
        g<<dmin[i]<<" ";
}
int main()
{
    citire();
    init();
    bellman_ford(1);
    afisare();
    return 0;
}