Pagini recente » Cod sursa (job #1019031) | Cod sursa (job #1363026) | Cod sursa (job #2915850) | Cod sursa (job #3039767) | Cod sursa (job #2129216)
#include <iostream>
#include <fstream>
#define NMAX 50010
#define CMAX 500002
#define INFIN 1<<30
using namespace std;
ifstream in("bellmanford.in");
ofstream out("bellmanford.out");
struct elem{
int val, cos;
elem *urm;
}*v[NMAX];
int n, m;
int costDrum[NMAX];
bool cicluNegativ;
int pus[NMAX];
void citire(){
in >> n >> m;
for(int i = 1; i <= m; i++){
int x, y, c;
in >> x >> y >> c;
elem *deAdaugat = new elem;
deAdaugat -> val = y;
deAdaugat -> cos = c;
deAdaugat -> urm = v[x];
v[x] = deAdaugat;
}
}
void bellmanford(){
int coada[CMAX], primul, ultimul;
bool pusInCoada[NMAX];
for(int i = 1; i <= n; i++){
costDrum[i] = INFIN;
pusInCoada[i] = false;
}
primul = ultimul = 1;
coada[primul] = 1;
pusInCoada[1] = true;
costDrum[1] = 0;
while (primul <= ultimul){
int nodActual = coada[primul];
pus[nodActual]++;
if(pus[nodActual] == n){
cicluNegativ = true;
return;
}
primul++;
elem* parcurg = v[nodActual];
while(parcurg != NULL){
if(costDrum[parcurg -> val] > costDrum[nodActual] + parcurg -> cos){
costDrum[parcurg -> val] = costDrum[nodActual] + parcurg -> cos;
if(pusInCoada[parcurg -> val] == false){
coada[++ultimul] = parcurg -> val;
pusInCoada[parcurg ->val] = true;
}
}
parcurg = parcurg -> urm;
}
pusInCoada[nodActual] = false;
}
}
void afisare(){
for(int i = 2; i <= n; i++){
out << costDrum[i]<<' ';
}
}
int main() {
citire();
bellmanford();
if(cicluNegativ == true){
out<<"Ciclu negativ!";
}else{
afisare();
};
return 0;
}