Cod sursa(job #2848878)

Utilizator Goia_DariusGoia Darius Goia_Darius Data 14 februarie 2022 09:18:59
Problema Algoritmul Bellman-Ford Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.41 kb
#include <fstream>
#include <cstring>
#include <algorithm>
#include <climits>

using namespace std;
ifstream f("bellmanford.in");
ofstream g("bellmanford.out");
int n,m;
int vec[1000000];
int viz[50010],fr[50010];
int T[3][250010],Start[50010],cost[50010];
int k,nr1,nr2,c;

///CITIRE
void Citire()
{
    f>>n>>m;
    for(int i=1;i<=m;i++)
    {
        f>>nr1>>nr2>>c;
        k++;
        T[0][k]=nr2;
        T[1][k]=Start[nr1];
        T[2][k]=c;
        Start[nr1]=k;
    }
    for(int i=2;i<=n;i++)
        cost[i]=300000000;
    vec[1]=1;
}
///CITIRE

///REZOLVARE
void Solve ()
{
    int pi=1,ps=1,st,elem,ok=1;
    while(ps<=pi)
    {
        elem=vec[ps];
        viz[elem]=0;
        st=Start[elem];
        fr[elem]++;
        if(fr[elem]>=n)
        {
            ok=0;
            break;
        }
        while(st)
        {
            if(cost[elem]+T[2][st]<cost[T[0][st]])
            {
                cost[T[0][st]]=cost[elem]+T[2][st];

                if(viz[T[0][st]]==0)
                {
                    viz[T[0][st]]=1;
                    vec[++pi]=T[0][st];

                }
            }
            st=T[1][st];
        }
        ps++;
    }
    if(!ok)
        g<<"Ciclu negativ!";
    else
        for(int i=2;i<=n;i++) g<<cost[i]<<" ";
}
///REZOLVARE

///MAIN
int main()
{
    Citire();
    Solve();
    return 0;
}
///MAIN