Pagini recente » Cod sursa (job #2910309) | Cod sursa (job #3352991) | Cod sursa (job #3314482) | Cod sursa (job #1008445) | Cod sursa (job #3336372)
#include <iostream>
#include <vector>
#include <algorithm>
#include <queue>
#define pii pair<int, int>
using namespace std;
const int NMAX = 5 * 1e5 + 5;
const char nl = '\n';
const int INF = 1e9 + 7;
struct edge {
int u, v, weight;
};
vector<pii> graph[NMAX];
vector<edge> edges;
int dist[NMAX];
int visited[NMAX];
bool inq[NMAX];
void bellmanford(int source, int n) {
for(int i = 1; i <= n; ++i) {
dist[i] = INF;
}
bool cycle = false;
queue<pii> q;
dist[source] = 0;
q.push({source, 0});
inq[source] = true;
while(!q.empty()) {
auto curr = q.front();
int curr_node = curr.first;
q.pop();
inq[curr_node] = false;
visited[curr_node]++;
if(visited[curr_node] > n) {
cycle = true;
break;
}
for(auto neigh: graph[curr_node]) {
if(dist[neigh.first] > dist[curr_node] + neigh.second) {
dist[neigh.first] = dist[curr_node] + neigh.second;
if(!inq[neigh.first]) {
q.push({neigh.first, dist[neigh.first]});
inq[neigh.first] = true;
}
}
}
}
if(cycle == true) {
cout << "Ciclu negativ" << nl;
} else {
for(int i = 2; i <= n; ++i)
cout << dist[i] << ' ';
}
}
int main() {
ios_base::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
freopen("bellmanford.in", "r", stdin);
freopen("bellmanford.out", "w", stdout);
int n, m;
cin >> n >> m;
for(int i = 0; i < m; ++i) {
int u, v, w;
cin >> u >> v >> w;
graph[u].push_back({v, w});
}
bellmanford(1, n);
return 0;
}