Cod sursa(job #3271975)

Utilizator danielbirsannBirsan Daniel danielbirsann Data 28 ianuarie 2025 00:43:21
Problema Algoritmul Bellman-Ford Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.37 kb
#include <iostream>
#include <vector>
#include <climits>

using namespace std;

struct Edge
{
    int u, v, cost;
};

void bellmanFord(int n, int m, vector<Edge> &edges)
{
    vector<long long> dist(n + 1, LLONG_MAX); // Distantele minime
    dist[1] = 0;                              // Pornim din nodul 1

    // Relaxam toate muchiile de N-1 ori
    for (int i = 1; i <= n - 1; ++i)
    {
        for (const auto &edge : edges)
        {
            if (dist[edge.u] != LLONG_MAX && dist[edge.u] + edge.cost < dist[edge.v])
            {
                dist[edge.v] = dist[edge.u] + edge.cost;
            }
        }
    }

    // Detectam cicluri negative
    for (const auto &edge : edges)
    {
        if (dist[edge.u] != LLONG_MAX && dist[edge.u] + edge.cost < dist[edge.v])
        {
            cout << "Ciclu negativ!\n";
            return;
        }
    }

    // Afisam rezultatele
    for (int i = 2; i <= n; ++i)
    {
        if (dist[i] == LLONG_MAX)
        {
            cout << "INF ";
        }
        else
        {
            cout << dist[i] << " ";
        }
    }
    cout << "\n";
}

int main()
{
    int n, m;
    cin >> n >> m;

    vector<Edge> edges(m);
    for (int i = 0; i < m; ++i)
    {
        cin >> edges[i].u >> edges[i].v >> edges[i].cost;
    }

    bellmanFord(n, m, edges);

    return 0;
}