Cod sursa(job #2856707)

Utilizator andreibucataruBucataru Andrei andreibucataru Data 24 februarie 2022 11:37:19
Problema Algoritmul Bellman-Ford Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.39 kb
#include <fstream>
#include <vector>
#include <queue>
#define NMAX 50002
#define INF 100000002
using namespace std;
ifstream fin("bellmanford.in");
ofstream fout("bellmanford.out");
struct varf
{
    int x,c;
};
vector<varf>A[NMAX];
int n,m,p=1,rez;
bool uz[NMAX];
int pre[NMAX],cmin[NMAX];
int cnt[NMAX],nr[NMAX];
queue<int>C;
void citire();
bool bellman();
void afisare();
int main()
{
    citire();
    rez=bellman();
    afisare();
    return 0;
}
void citire()
{
    int x,y,i,c;
    varf a;
    fin>>n>>m;
    for(i=1;i<=m;i++)
    {
        fin>>x>>y>>c;
        a.x=y;
        a.c=c;
        A[x].push_back(a);
    }
    for(i=1;i<=n+1;i++)
        cmin[i]=INF;
    cmin[p]=0;
    cnt[p]=1;
}
bool bellman()
{
    int x,i,vf,cost;
    C.push(p);
    nr[p]=1;
    while(!C.empty())
    {
        x=C.front();
        C.pop();
        for(i=0;i<A[x].size();i++)
        {
            vf=A[x][i].x;
            cost=A[x][i].c;
            if(cmin[vf]>cmin[x]+cost)
            {
                cmin[vf]=cmin[x]+cost;
                C.push(vf);
                nr[vf]++;
                if(nr[vf]==n)
                    return 0;
            }
        }
    }
    return 1;
}
void afisare()
{
    int i;
    if(rez==0)
    {
        fout<<"Ciclu negativ!";
        return;
    }
    for(i=2;i<=n;i++,fout<<' ')
        fout<<cmin[i];
}