Pagini recente » Cod sursa (job #1346542) | Cod sursa (job #2558376) | Cod sursa (job #1065419) | Cod sursa (job #1132637) | Cod sursa (job #1605987)
#include <iostream>
#include <fstream>
#define oo 199999999
using namespace std;
int a[9000][9000], coada[9000], distante[9000], vizitat[9000], qfront, qback;
ifstream f("bellmanford.in");
ofstream fout("bellmanford.out");
int bellman_ford(int start, int n)
{
int i, nod;
for(i=1; i<=n; i++)
distante[i]=oo;
distante[start]=0;
vizitat[start]=1;
qfront=1; qback=0;
coada[++qback]=start; // diferenta dintre i++ si ++i o vezi aici http://stackoverflow.com/questions/24853/what-is-the-difference-between-i-and-i
while(qfront<=qback)
{
int ok=0;
nod=coada[qfront];
qfront++;
vizitat[nod]++; // habar nu am ce fac liniile astea
if(vizitat[nod]>n)
return 0;
for(i=1; i<=n; i++)
if(a[nod][i]!=0)
if(distante[i]>a[nod][i])
{ if(ok==0)
{distante[i]=0;ok=1;}
distante[i]=distante[nod]+a[nod][i];
coada[++qback]=i;
}
}
return 1;
}
int main()
{
int n, m, i=0, x, y, cost;
f >> n >> m; // m numarul de muchii !!! am facut pe orientat
while(i<m)
{
f >> x >> y >> cost;
a[x][y]=cost;
i++;
}
if(bellman_ford(1, n))
for(i=2; i<=n; i++)
fout << distante[i] << " ";
else
fout << "Ciclu negativ!";
return 0;
}