Cod sursa(job #3213476)

Utilizator andrei_C1Andrei Chertes andrei_C1 Data 13 martie 2024 10:18:58
Problema Algoritmul Bellman-Ford Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.99 kb
#include <bits/stdc++.h>
using namespace std;

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

const int kInf = 1e9;

vector<int> bf(int s, const vector<vector<pair<int, int>>> &adj) {
	int n = adj.size();
	vector<int> dist(n, kInf), frq(n);
	vector<bool> inQ(n);
	queue<int> q;
	dist[s] = 0;
	q.emplace(s);
	inQ[s] = 1;
	while(!q.empty()) {
		int u = q.front();
		q.pop();
		inQ[u] = 0;
		for(const auto &[v, c]: adj[u]) {
			if(dist[v] > dist[u] + c) {
				dist[v] = dist[u] + c;
				if(++frq[v] > n) {
					fout << "Ciclu negativ!\n";
					exit(0);
				}
				if(!inQ[v]) {
					q.emplace(v);
					inQ[v] = 1;
				}
			}
		}
	}
	return dist;
}

int main() {
	int n, m;
	fin >> n >> m;
	vector<vector<pair<int, int>>> adj(n);
	for(int i = 0; i < m; i++) {
		int u, v, c;
		fin >> u >> v >> c;
		u--; v--;
		adj[u].emplace_back(v, c);
	}
	vector<int> dist = bf(0, adj);
	for(int i = 1; i < n; i++) {
		if(dist[i] == kInf) {
			fout << "0 ";
		} else {
			fout << dist[i] << " ";
		}
	}
	return 0;
}