Pagini recente » Istoria paginii runda/top_12_agm | Cod sursa (job #1138793) | Istoria paginii runda/cnrv_4/clasament | Cod sursa (job #1715404) | Cod sursa (job #2157094)
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
#define DN 50001
#define inf 2000000
using namespace std;
ifstream f("bellmanford.in");
ofstream g("bellmanford.out");
struct vecin
{
int y;
int cost;
};
vector <vecin> v[DN];
queue <int> q;
int n, m; // numarul de noduri si muchii
int d[DN]; // distanta minima de la nodul 1 la nodul i
int p[DN]; // tine minte de cate ori s-a folosit fiecare nod i (pt a vedea daca exista ciclu negativ)
int t[DN]; // vector de tati
void read()
{
f>>n>>m;
for(int i=1; i<=m; i++)
{
vecin w;
int x;
f>>x>>w.y>>w.cost;
v[x].push_back(w);
}
}
int bellmanford(int k)
{
//se initiaza distantele cu infinit
for(int i=1; i<=n; i++)
d[i]=inf;
//distanta de la nodul curent e 0
d[k]=0;
//tata de curent e 0
t[k]=0;
//se pune in coada nodul de plecare
q.push(k);
int first;
while(!q.empty())
{
first=q.front();
q.pop();
p[first]++; // am folosit nodul first
if(p[first]>=n)
return 1; // ciclu negativ ( s-ar invarti la infinit algoritmul)
for(int i=0; i<v[first].size(); i++)
{
// se verifica daca exista o muchie de cost minim mai mica
if(d[v[first][i].y]>(d[first]+v[first][i].cost))
{
// se schimba valoarea
d[v[first][i].y]=d[first]+v[first][i].cost;
//se adauga in coada
q.push(v[first][i].y);
// schimbam tatal
t[v[first][i].y]=first;
}
}
}
return 0;
}
void afis()
{
for(int i=1; i<=n; i++)
if(d[i]!=inf&&d[i]!=0)
g<<d[i]<<" ";
}
int main()
{
read();
if(bellmanford(1)==0)
afis();
else g<<"Ciclu negativ!";
return 0;
}