Cod sursa(job #3329701)

Utilizator AlexN_04Nedelcu Alex AlexN_04 Data 15 decembrie 2025 00:00:24
Problema Algoritmul Bellman-Ford Scor 35
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.31 kb
#include <iostream>
#include <fstream>
#include <vector>

#define INF 1e9

using namespace std;

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

struct Muchie {
    int u, v, cost;

    Muchie() {}
    Muchie(int x, int y, int w) : u(x), v(y), cost(w) {}
};

bool bellmanFord (int start, vector<Muchie> &muchii, vector<int> &d, int N) {
    vector<int> tata(N + 1, 0);
    d.assign(N + 1, INF);

    d[start] = 0;

    for (int k = 1; k <= N - 1; k++) {
        for (auto& crt : muchii) {
            if (d[crt.u] < INF && d[crt.u] + crt.cost < d[crt.v]) {
                d[crt.v] = d[crt.u] + crt.cost;
            }
        }
    }

    for (auto& crt : muchii) {
        if (d[crt.u] < INF && d[crt.u] + crt.cost < d[crt.v]) {
            d[crt.v] = d[crt.u] + crt.cost;
            return true;
        }
    }

    return false;
}

int main() {
    
    vector<Muchie> muchii;
    int N, M;
    fin >> N >> M;

    for (int i = 0; i < M; i++) {
        int x, y, w;
        fin >> x >> y >> w;

        muchii.push_back(Muchie(x, y, w));
    }

    vector<int> d;
    bool hasCycle = bellmanFord(1, muchii, d, N);
    
    if (hasCycle) {
        fout << "Ciclu negativ!" << endl;
    } else {
        for (int i = 2; i <= N; i++) {
            fout << d[i] << ' ';
        }
        fout << endl;
    }
    return 0;
}