Cod sursa(job #2112399)

Utilizator sabina.hutanuSabina Hutanu sabina.hutanu Data 23 ianuarie 2018 13:47:10
Problema Algoritmul Bellman-Ford Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 1.28 kb
#include <fstream>
#include <vector>
#include <queue>
#define NMAX 50005
#define INF 1001

using namespace std;

ifstream fin ("bellmanford.in");
ofstream fout ("bellmanford.out");

void citire();
void bf();

struct graf
{
    int vf, c;
};

int dmin[NMAX], nr[NMAX], n, m, start;
vector<graf> L[NMAX];
queue<int> C;

int main()
{
    citire();
    bf();
    return 0;
}

void citire()
{
    graf aux;
    int i, x;
    start=1;
    fin>>n>>m;
    for(i=1; i<=m; i++)
    {
        fin>>x>>aux.vf>>aux.c;
        L[x].push_back(aux);
    }
    C.push(start);
    for(i=2; i<=n; i++)
        dmin[i]=INF;
}

void bf()
{
    bool ok=0;
    int i, y, x;
    while (!C.empty() && !ok)
    {
        x=C.front();
        C.pop();
        for (i=0; i<L[x].size(); i++)
        {
            y=L[x][i].vf;
            if (dmin[y] > dmin[x]+L[x][i].c)
            {
                dmin[y] = dmin[x] + L[x][i].c;
                nr[y]++;
                C.push(y);
                if (nr[y] == n)
                {
                    ok = 1;
                    break;
                }
            }
        }
    }
    if(ok==1)
        fout<<"Ciclu negativ!"<<'\n';
    else
        for(i=2; i<=n; i++)
            fout<<dmin[i]<<' ';
}