Pagini recente » Cod sursa (job #1086645) | Cod sursa (job #2081876) | Cod sursa (job #868472) | Cod sursa (job #2265613) | Cod sursa (job #2365210)
#include <fstream>
#include <queue>
#include <vector>
#define MAX 50002
#define INF 500000000
using namespace std;
ifstream fin("bellmanford.in");
ofstream fout("bellmanford.out");
int n, start = 1;
int cmin[MAX]; //cmin[x] costul drumului de cost minim de la start la x
int nr[MAX]; // nr[x] este de cate ori a fost actualizat costul drumului de cost minim de la n la x
struct varf{int x, c;};
vector <varf> G[MAX];
queue <int> C;
void citire();
bool bellman_ford();
int main()
{int i;
citire();
if(!bellman_ford())
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, k, m, c;
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_ford()
///return 0 daca nu e solutie
///else return 1
{int vf, i;
///initializare
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;
}