Pagini recente » Cod sursa (job #2317314) | Cod sursa (job #1466531) | Istoria paginii runda/meister | Cod sursa (job #2408835) | Cod sursa (job #2365265)
#include <fstream>
#include <queue>
#include <vector>
#define NMAX 50003
#define INF 1000000000
using namespace std;
ifstream fin ("bellmanford.in");
ofstream fout ("bellmanford.out");
int n, start=1;
int cmin[NMAX]; ///CMIN[X] COSTUL DRUMULUI DE COST MINIM DE LA START LA X
int nr[NMAX]; ///nr[x]=de cate ori a fost actualizat costul drumului de cost minim de la startt la x
struct varf
{
int x;
int c;
};
vector<varf> G[NMAX];
queue<int> C;
void citire();
bool bellman_ford();
void afisare();
int main()
{
citire();
if(!bellman_ford())
fout<<"Ciclu negativ!";
else
afisare();
fout.close();
return 0;
}
void citire()
{
int i, j, c, m, k;
varf aux;
fin>>n>>m;
for(k=0; k<m; k++)
{
fin>>i>>j>>c;
aux.x=j; aux.c=c;
//j intra in lista de adiacenta a lui i
G[i].push_back(aux);
}
}
bool bellman_ford()
///returnam 0 daca nu exista sol
///1 daca exista sol
{
///initializarea
int i, vf;
for(i=1; i<=n; i++)
cmin[i]=INF;
cmin[start]=0;
C.push(start);
while(!C.empty())
{
vf=C.front();
C.pop();
///parcurg lista de adiacenta a lui vf
for(i=0; i<G[vf].size(); i++)
if(cmin[G[vf][i].x]>cmin[vf]+G[vf][i].c)
{
cmin[G[vf][i].x]=cmin[vf]+G[vf][i].c;
nr[G[vf][i].x]++;
if(nr[G[vf][i].x]==n)
return 0;
C.push(G[vf][i].x);
}
}
return 1;
}
void afisare()
{
int i;
for(i=2; i<=n; i++)
if(cmin[i]==INF)
fout<<-1<<' ';
else
fout<<cmin[i]<<' ';
}