Pagini recente » Cod sursa (job #3354946) | Borderou de evaluare (job #3309095) | Cod sursa (job #463622) | Cod sursa (job #3237976) | Cod sursa (job #3336685)
#include<bits/stdc++.h>
using namespace std;
struct Edge
{
int u, v, w;
};
const int INF = 2e9;
vector<Edge> edges;
vector<int> dist;
bool bellmanford(int s, int n) {
dist[s] = 0;
for (int i = 1; i <= n-1; i++) {
bool changed = false; // verificăm dacă s-a schimbat vreo distanță
for (const auto& edge : edges) {
int u = edge.u, v = edge.v, w = edge.w;
if (dist[u] != INF && dist[u] + w < dist[v]) {
dist[v] = dist[u] + w;
changed = true;
}
}
if (!changed) return true;
}
// we can further relax, then we have an infinite cycle
for (const auto& edge : edges) {
int u = edge.u, v = edge.v, w = edge.w;
if (dist[u] != INF && dist[u] + w < dist[v]) {
return false;
}
}
return true;
}
int main() {
freopen("bellmanford.in", "r", stdin);
freopen("bellmanford.out", "w", stdout);
int n, m;
cin >> n >> m;
dist.assign(n + 1, INF);
for (int i = 0; i < m; i++) {
int u, v, w;
cin >> u >> v >> w;
edges.push_back({u, v, w});
}
bellmanford(1, n);
for (int i = 2; i <= n; i++)
cout << dist[i] << " ";
return 0;
}