Cod sursa(job #2966053)

Utilizator CalinHanguCalinHangu CalinHangu Data 16 ianuarie 2023 18:20:45
Problema Algoritmul Bellman-Ford Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.49 kb
#include <fstream>
#include <algorithm>
#include <cmath>
#include <cstring>
#include <vector>
#include <queue>

#define ll long long
#define pb push_back
#define bg begin()
#define ed end()
#define cl clear()
#define pi pair<int, int>

///#define int ll

using namespace std;

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

const int MOD = 1e9;
const char nl = '\n';
const int NMAX = 50000;
const int INF = 1e9;

struct graph{
    int node, weight;
};

int dist[NMAX + 5], f[NMAX + 5], n, m;

vector <graph> v[NMAX + 5];
queue <int> q;

bool cycle = false;

void blf(int source){
    for(int i = 1; i <= n; ++i)
        dist[i] = INF;
    q.push(source);
    dist[source] = 0;
    while(!q.empty()){
        int cur = q.front();
        f[cur]++;
        if(f[cur] == n - 1){
            cycle = true;
            return;
        }
        for(auto it: v[cur]){
            if(dist[cur] + it.weight < dist[it.node]){
                dist[it.node] = dist[cur] + it.weight;
                q.push(it.node);
            }
        }
        q.pop();
    }
}

void solve(){
    blf(1);
    if(cycle == true)
        out << "Ciclu negativ!";
    else{
        for(int i = 2; i <= n; ++i)
            out << dist[i] << ' ';
        out << nl;
    }
}

int main(){
    in >> n >> m;
    for(int i = 1; i <= m; ++i){
        int a, b, w;
        in >> a >> b >> w;
        v[a].push_back({b, w});
    }
    solve();
    return 0;
}