Cod sursa(job #3165107)

Utilizator octavian202Caracioni Octavian Luca octavian202 Data 5 noiembrie 2023 14:16:08
Problema Algoritmul Bellman-Ford Scor 35
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.56 kb
#include <iostream>
#include <fstream>

#define ll long long

using namespace std;

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

struct Edge {
    ll from, to, cost;

    Edge(ll from, ll to, ll cost) {
        this->from = from;
        this->to = to;
        this->cost = cost;
    }

    Edge() {
        this->from = 0;
        this->to = 0;
        this->cost = 0;
    }
};

const ll NMAX = 50003, MMAX = 250003, INF = 1e14;
Edge edges[MMAX];
int n, m;
ll d[NMAX];

bool ford(ll s) {
    for (int i = 1; i <= n; i++) {
        d[i] = INF;
    }
    d[s] = 0;

    bool relaxedAnEdge = true;
    for (int i = 1; i <= n - 1; i++) {
        relaxedAnEdge = false;
        for (int j = 1; j <= m; j++) {
            Edge edge = edges[j];
            if (d[edge.from] + edge.cost < d[edge.to]) {
                d[edge.to] = d[edge.from] + edge.cost;
                relaxedAnEdge = true;
            }
        }
    }

    for (int i = 1; i <= n - 1; i++) {
        for (int j = 1; j <= m; j++) {
            Edge edge = edges[j];
            if (d[edge.from] + edge.cost < d[edge.to]) {
                d[edge.to] = d[edge.from] + edge.cost;
                return false;
            }
        }
    }

    return true;
}

int main() {

    fin >> n >> m;
    for (int i = 1; i <= m; i++) {
        ll from, to, cost;
        fin >> from >> to >> cost;
        edges[i] = Edge(from, to, cost);
    }

    if (ford(1)) {
        for (int i = 2; i <= n; i++) {
            fout << d[i] << ' ';
        }
    } else {
        fout << "Ciclu negativ!";
    }


    return 0;
}