Cod sursa(job #2884453)

Utilizator stefandutastefandutahoria stefanduta Data 3 aprilie 2022 17:29:40
Problema Algoritmul Bellman-Ford Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.61 kb

#include <fstream>
#include <queue>
#include <vector>
#define NMAX 50005
#define MMAX 250005

using namespace std;
ifstream in("bellmanford.in");
ofstream out("bellmanford.out");

const int INF = 1e9 + 7;
vector < pair <int, int> > vecini[NMAX];
queue < int > q;
int counter[NMAX];
int dist[NMAX];
bool viz[NMAX];

int main()
{
    int n, m, i, j, x, y, c;
    in >> n >> m;
    for (i = 1; i <= m; ++i)
    {
        in >> x >> y >> c;
        vecini[x].push_back({y, c});
    }

    /*for (i = 1; i <= n; ++i)
    {
        for (j = 0; j < vecini[i].size(); ++j)
          out << vecini[i][j].first << " ";
        out << '\n';
    }*/

    for (i = 2; i < NMAX; ++i)
    {
        dist[i] = INF;
    }

    dist[i] = 0;
    q.push(1);
    viz[1] = 1;
    ++counter[1];

    while (!q.empty() && counter[q.front()] < n)
    {
        int nod = q.front();
        //out << nod << '\n';
        for (i = 0; i < vecini[nod].size(); ++i)
        {
            int vecin = vecini[nod][i].first;
            int distanta = vecini[nod][i].second;
            if (dist[nod] + distanta < dist[vecin])
            {
                dist[vecin] = dist[nod] + distanta;
                ++counter[vecin];

                if (viz[vecin] == 0)
                {
                    q.push(vecin);
                    viz[vecin] = 1;
                }
            }
        }
        viz[nod] = 0;
        q.pop();
    }

    if (!q.empty())
        out << "Ciclu negativ!";
    else
    {
        for (i = 2; i <= n; ++i)
            out << dist[i] << " ";
    }
    return 0;
}