Pagini recente » Cod sursa (job #2690082) | Cod sursa (job #3277627) | Cod sursa (job #2391996) | Cod sursa (job #973160) | Cod sursa (job #2530862)
#include <bits/stdc++.h>
using namespace std;
ifstream f("bellmanford.in");
ofstream g("bellmanford.out");
/// fv[x] = de cate ori am gasit in nodul x un drum mai bun
/// daca fv[x] > (n-1); cum nodul x poate avea maxim (n-1) vecini => de acum incolo se va obtine un ciclu, respectiv un drum mai bun (mai mic) de un inifnit de ori. => ma opresc si afisez ca am gasit ciclu negativ SAU care va deveni negativ.
/// daca nu as fi gasit un ciclu care sa dea mereu un drum si mai mic => x ar fi fost apelat de maxim (n-1) ori (adica fv[x] <= (n-1))
vector < pair <int,int> > v[50100];
queue < pair <int,int> > q;
int ciclu,n,dist[50100],fv[50100],este_in_coada[50100];
void Bellman()
{
/// initializare
for(int i=1;i<=n;i++)
dist[i]=INT_MAX/2;
dist[1]=0;
q.push({1,0});
este_in_coada[1]=1;
fv[1]=1;
while(!q.empty())
{
int nod_curent=q.front().first;
int dist_curent=q.front().second;
if(fv[nod_curent]==n)
{
g<<"Ciclu negativ!";
ciclu=1;
return;
}
for(int i=0;i<v[nod_curent].size();i++)
{
int vecin=v[nod_curent][i].first;
int dist_vecin=v[nod_curent][i].second;
if(dist[vecin] > dist_vecin + dist[nod_curent]) /// am gasit un drum mai bun
{
dist[vecin]=dist_vecin+dist[nod_curent];
fv[vecin]++;
if(!este_in_coada[vecin]) /// il pun doar daca nu este deja in coada
{
q.push({vecin,dist[vecin]});
este_in_coada[vecin]=1;
}
}
}
q.pop();
este_in_coada[nod_curent]=0;
}
}
int m,i,x,y,c;
int main()
{
f>>n>>m;
for(i=1;i<=m;i++)
{
f>>x>>y>>c;
v[x].push_back({y,c});
}
Bellman();
if(!ciclu)for(i=2;i<=n;i++)g<<dist[i]<<" ";
return 0;
}