Cod sursa(job #3258499)

Utilizator andreea678Rusu Andreea-Cristina andreea678 Data 22 noiembrie 2024 21:40:31
Problema Algoritmul Bellman-Ford Scor 35
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.4 kb
#include <bits/stdc++.h>
#define NMAX 50005
#define INF 999999999

using namespace std;

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

vector<vector<pair<int, int>>> gr;
int n, m;
int x, y, c;
int distanta[NMAX];

void read() {
    fin >> n >> m;
    gr.resize(n + 1);
    for (int i = 1; i <= m; ++i) {
        fin >> x >> y >> c;
        gr[x].push_back({y, c});
    }
}

void setDistances() {
    for (int i = 1; i <= n; ++i) {
        distanta[i] = INF;
    }
}

vector<int> bellman_ford(int source) {
    setDistances();
    distanta[source] = 0;

    for (int i = 0; i < n; ++i) {
        for (int x = 1; x <= n; ++x) {
            for (const auto& vecin : gr[x]) {
                int v = vecin.first;
                int cost = vecin.second;
                if (distanta[x] != INF && distanta[x] + cost < distanta[v]) {
                    if (i == n - 1) return {-1};
                    distanta[v] = distanta[x] + cost;
                }
            }
        }
    }

    return vector<int>(distanta + 1, distanta + n + 1);
}

int main() {
    read();
    vector<int> result = bellman_ford(1);

    if (result[0] == -1) {
        fout << "Ciclu negativ!\n"; // Negative cycle detected
    } else {
        for (int i = 2; i <= n; ++i) {
            fout << distanta[i] << ' ';
        }
        fout << "\n";
    }

    return 0;
}