Cod sursa(job #3336685)

Utilizator voaidesrVoaides Robert voaidesr Data 25 ianuarie 2026 12:48:27
Problema Algoritmul Bellman-Ford Scor 15
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.23 kb
#include<bits/stdc++.h>
using namespace std;

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

const int INF = 2e9;
vector<Edge> edges;
vector<int> dist;

bool bellmanford(int s, int n) {
    dist[s] = 0;
    for (int i = 1; i <= n-1; i++) {
        bool changed = false; // verificăm dacă s-a schimbat vreo distanță
        for (const auto& edge : edges) {
            int u = edge.u, v = edge.v, w = edge.w;
            if (dist[u] != INF && dist[u] + w < dist[v]) {
                dist[v] = dist[u] + w;
                changed = true;
            }
        }

        if (!changed) return true;
    }

    // we can further relax, then we have an infinite cycle
    for (const auto& edge : edges) {
        int u = edge.u, v = edge.v, w = edge.w;
        if (dist[u] != INF && dist[u] + w < dist[v]) {
            return false;
        }
    }

    return true;
}


int main() {
    freopen("bellmanford.in", "r", stdin);
    freopen("bellmanford.out", "w", stdout);

    int n, m;
    cin >> n >> m;
    dist.assign(n + 1, INF);

    for (int i = 0; i < m; i++) {
        int u, v, w;
        cin >> u >> v >> w;
        edges.push_back({u, v, w});
    }

    bellmanford(1, n);

    for (int i = 2; i <= n; i++)
        cout << dist[i] << " ";

    return 0;
}