Cod sursa(job #2683785)

Utilizator Mirela_MagdalenaCatrina Mirela Mirela_Magdalena Data 12 decembrie 2020 09:50:38
Problema Algoritmul Bellman-Ford Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.49 kb
#define INF 0x3f3f3f3f
#define NMAX 50005
#include <iostream>
#include <fstream>
#include <queue>
using namespace std;

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

struct elem{
    int nod, cost;
};

int n, m;
int viz[NMAX], Dmin[NMAX], decateori[NMAX];
vector<elem> graph[NMAX];
queue<int> Q;


void init()
{
    for(int i = 1; i <= n; ++i)
        Dmin[i] = INF;
}





void read()
{
    int x, y, c;

    f>>n>>m;
    init();

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

void bellman_ford()
{
    Q.push(1);
    Dmin[1] = 0;
    viz[1] = 1;

    while(!Q.empty())
    {
        int top = Q.front();
        Q.pop();
        viz[top] = 0;

        for(auto &v:graph[top])
            if(Dmin[v.nod] > Dmin[top] + v.cost)
            {
                Dmin[v.nod] = Dmin[top] + v.cost;
                decateori[v.nod] ++;
                if(viz[v.nod] == 0)
                {
                    Q.push(v.nod);
                    viz[v.nod] = 1;
                }

                if(decateori[v.nod] >= n)
                {
                    g<<"Ciclu negativ!";
                    exit(0);
                }
            }
    }
}

void write()
{
    for(int i = 2; i<= n; ++i)
    {
        if(Dmin[i] >= INF)
            g<<0<<" ";
        else g<<Dmin[i]<<" ";
    }
}

int main()
{
    read();
    bellman_ford();
    write();
    return 0;
}