Pagini recente » Cod sursa (job #2313685) | Cod sursa (job #1149456) | Cod sursa (job #1217830) | Cod sursa (job #1180624) | Cod sursa (job #2365264)
#include <fstream>
#include <queue>
#include <vector>
#define NMAX 50015
#define INF 10000000000
using namespace std;
ifstream fin("bellmanford.in");
ofstream fout("bellmanford.out");
int n, start=1, i, k, vf;
int cmin[NMAX]; //cmin[x] costul drumului de cost minim de la start la x
int nr[NMAX]; //nr[x] de cate ori s-a acyualizat costul drumului de cost minim de la start la x
struct varf{int x; int c;};
vector <varf> G[NMAX];
queue <int> C;
void citire();
bool bellman();
int main ()
{
citire();
bellman();
if (!bellman())
fout<<"Ciclu negativ!";
else
for (i=2; i<=n; i++)
if (cmin[i]==INF)
fout<<"-1"<<' ';
else fout<<cmin[i]<<' ';
fout.close();
return 0;
}
void citire()
{
int i, j, c, m;
varf aux;
fin>>n>>m;
for (k=0; k<m; k++)
{
fin>>i>>j>>c;
aux.x=j; aux.c=c;
G[i].push_back(aux);
}
}
bool bellman() //0 fara solutie si 1 pt soluti
{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 x
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;
}