Pagini recente » Diferente pentru implica-te/arhiva-educationala intre reviziile 142 si 143 | Cod sursa (job #2331445) | Cod sursa (job #138165) | Cod sursa (job #2400104) | Cod sursa (job #2422470)
#include <bits/stdc++.h>
using namespace std;
struct Muchie {
int v, c;
bool operator<(const Muchie& m) const {
return c > m.c;
}
};
vector<Muchie> g[50010];
int inQueue[50010];
int viz[50010];
int dist[50010];
int n, m;
int main() {
freopen("bellmanford.in", "r", stdin);
freopen("bellmanford.out", "w", stdout);
scanf("%d%d", &n, &m);
for(int i = 0; i < m; i++)
{
int a, b, c;
scanf("%d%d%d", &a, &b, &c);
g[a].push_back({b, c});
}
memset(dist, 0x3f, sizeof(dist));
priority_queue<Muchie> q;
q.push({1, 0});
inQueue[1] = 1;
viz[1] = 1;
dist[1] = 0;
while(!q.empty())
{
int nod = q.top().v;
int cost = q.top().c;
q.pop();
if(cost > dist[nod])
continue;
viz[nod]++;
if(viz[nod] >= n)
{
printf("Ciclu negativ!");
return 0;
}
for(const auto& vec : g[nod])
{
if(dist[nod] + vec.c < dist[vec.v])
{
dist[vec.v] = dist[nod] + vec.c;
q.push({vec.v, dist[vec.v]});
}
}
}
for(int i = 2; i <= n; i++)
printf("%d ", dist[i]);
return 0;
}