Cod sursa(job #3294794)

Utilizator AvramBossAvram Alexandru Ionut AvramBoss Data 28 aprilie 2025 16:14:46
Problema Algoritmul Bellman-Ford Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.89 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>

using namespace std;
string fisier="bellmanford";
ifstream fin(fisier+".in");
ofstream fout(fisier+".out");

int n, m, nod_start;
const int NMAX=50005, INF=1E9;
vector <pair<int, int>>graf[NMAX];
queue <int> coada;
int frecv[NMAX]; bool viz[NMAX];
int dist[NMAX];

void citire()
{
    fin>>n>>m;
    int x, y, cost;
    for (int i=1; i<=m; ++i)
    {
        fin>>x>>y>>cost;
        graf[x].push_back(make_pair(y, cost));
    }

    fin.close();
}
/*
void citire_2()
{
    fin>>n>>nod_start;
    int x, y, cost;
    while(fin>>x>>y>>cost)
        graf[x].push_back(make_pair(y, cost));
}
*/
void initializare()
{
    for (int i=1; i<=n; ++i)
    {
        frecv[i]=viz[i]=0;
        dist[i]=INF;
    }
    nod_start=1;
}
bool ok=1;
void bellman_ford(int start)
{
    initializare();
    dist[start]=0, coada.push(start), viz[start]=1;
    while (!coada.empty())
    {
        int nod_curent=coada.front();
        ++frecv[nod_curent];
        if (frecv[nod_curent]>=n)
        {
                ok=0;
                return;//evitam un ciclu negativ
        }
        coada.pop();
        viz[nod_curent]=0;
        for (int i=0; i<graf[nod_curent].size(); ++i)
        {
            int vecin=graf[nod_curent][i].first;
            int cost=graf[nod_curent][i].second;
            if (dist[vecin]>dist[nod_curent]+cost)
            {
                dist[vecin]=dist[nod_curent]+cost;
                if (!viz[vecin])
                    coada.push(vecin);
            }
        }
    }
}
void afisare()
{
    if(!ok)
    {
        fout<<"Ciclu negativ\n";
        return;
    }
    for (int i=1; i<=n; ++i)
        fout<<dist[i]<<' ';
    fout<<'\n';

    fout.close();
}
int main()
{
    citire();
    bellman_ford(nod_start);
    afisare();
    return 0;
}