Cod sursa(job #2856717)

Utilizator SebytomitaTomita Sebastian Sebytomita Data 24 februarie 2022 11:39:11
Problema Algoritmul Bellman-Ford Scor 20
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.79 kb
#include <fstream>
#include <vector>
#define INF 1e9
#define NMAX 10004
#include <queue>

using namespace std;

ifstream cin ("bellmanford.in");
ofstream cout ("bellmanford.out");

struct varf
{
    int x, c;
};

int n, x0,rez;

vector <varf> G[102]; ///liste de adiacenta cu costuri

bool uz[102];
int cmin[102];
int pre[102];
int afis[102];
int nr[NMAX]; ///nr[i] nr de drumuri de cost minim de la x0 la i

queue <int> C;
void citire();
bool bellman();
void afisare();

int main()
{
    citire();
    rez=bellman();
    afisare();
    return 0;
}

void citire()
{
    int i, j, c,m;
    varf aux;
    x0=1;
    cin>>n>>m;
    while (cin>>i>>j>>c)
    {
        //in lista de adiacenta a lui i trebuie sa adaug perechea j,k
        aux.x=j;
        aux.c=c;
        G[i].push_back(aux);
    }

    for (i=1; i<=n; i++)
        cmin[i]=INF;
    cmin[x0]=0;

}

bool bellman()
///returneaza 0 daca exista circuite de cost negativ si 1 altfel
{
    int x,vf,cost,i;
    ///intializez coada cu vf de start
    C.push(x0);
    nr[x0]=1;
    while(!C.empty())
    {
        x=C.front();
        C.pop();
        ///parcurg lista de adiaceta a lui x
        for(i=0;i<G[x].size();i++)
        {
            vf=G[x][i].x;
            cost=G[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, j, cnt;
    if(rez==0)
    cout<<"Ciclu negativ!";
    else
    {
        for(i=2;i<=n;i++)
        {
            cout<<cmin[i]<<' ';
        }
        cout<<'\n';
;    }
}