Cod sursa(job #862540)
#include <fstream>
#define INF 1000000000
using namespace std;
ifstream fin("bellmanford.in");
ofstream fout("bellmanford.out");
int n, start;
int cmin[50000];
int coada[250000000], prim, ultim, nrpus[50000];
void citire();
void bell();
struct varf
{
int cost, vf;
}c[10000][10000];
int main()
{
citire();
bell();
return 0;
}
void citire()
{
int i, m, x, y, costv;
fin>>n>>m; start=1;
for(i=1;i<=m;i++)
{
fin>>x>>y>>costv;
c[x][0].vf++; c[x][c[x][0].vf].vf=y;
c[x][0].cost++; c[x][c[x][0].cost].cost=costv;
}
}
void bell()
{
int i, x , ok, nr;
int prim,ultim;
for(i=1;i<=n;i++)
cmin[i]=INF;
cmin[start]=0;
ultim=1; prim=1;
coada[1]=start; x=start; ok=0;
while(prim<=ultim)
{
x=coada[prim++];
for(i=1;i<=c[x][0].vf;i++)
{
nr++;
if(cmin[c[x][i].vf]>cmin[x]+c[x][i].cost&&c[x][i].cost!=INF)
{
coada[++ultim]=c[x][i].vf;
cmin[c[x][i].vf]=cmin[x]+c[x][i].cost;
nrpus[c[x][i].vf]++;
}
if(nrpus[c[x][i].vf]>=n-1)
{ok=1; break;}
}
if(ok) break;
}
if(ok) fout<<"Ciclu negativ!"<<'\n';
else
for(i=2;i<=n;i++)
fout<<cmin[i]<<" ";
}