Cod sursa(job #3275867)

Utilizator VVasiuVasiu Vasile VVasiu Data 11 februarie 2025 20:41:21
Problema Algoritmul Bellman-Ford Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.34 kb
#include <fstream>
#include <vector>
#include <queue>

#define N 50000
#define inf 999999999
using namespace std;

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

int n, m, ciclu;
int viz[N + 1];
int d[N + 1];
int nr[N + 1];

vector < pair<int, int> > a[N + 1];
queue < int > c;

void ford()
{
    c.push(1);
    viz[1] = 1;
    while( !c.empty() )
    {
        int nod = c.front();
        viz[nod] = 0;
        nr[nod] ++;
        if(nr[nod] >= n)
        {
            ciclu = 1;
            break;
        }
        for(auto i : a[nod])
        {
            int vecin = i.first;
            int cost = i.second;
            if(d[nod] + cost < d[vecin])
            {
                d[vecin] = d[nod] + cost;
                if( !viz[vecin] )
                {
                    c.push(vecin);
                    viz[vecin] = 1;
                }
            }
        }
        c.pop();
    }
}

int main()
{
    fin >> n >> m;
    while(m --)
    {
        int x, y, c;
        fin >> x >> y >> c;
        a[x].push_back( {y, c} );
    }

    for(int i=1; i<=n; i++)
        d[i] = inf;
    d[1] = 0;

    ford();

    if( ciclu )
        fout << "Ciclu negativ!";
    else
    {
        for(int i=2; i<=n; i++)
            fout << d[i] << " ";
    }
    return 0;
}