Cod sursa(job #2365268)

Utilizator LoredanaMironMiron Loredana LoredanaMiron Data 4 martie 2019 12:44:25
Problema Algoritmul Bellman-Ford Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.32 kb
#include <fstream>
#include <queue>
#include <vector>
#define NMAX 50002
#define INF 500000000
using namespace std;
ifstream fin("bellmanford.in ");
ofstream fout("bellmanford.out");
void citire();

bool BF();
int n,start=1;
int cmin[NMAX];//costul drumului de cost mnim de la start la x
int nr[NMAX]; // de cate ori a fost actualizat costul drumului de cost minim de la start la x
struct varf{int x;int c;};
vector <varf> G[NMAX];
queue <int>C;

int main()
{  int i;
    citire();
  if(!BF())
        fout<<"Ciclu negativ!";
  else for(i=2;i<=n;i++)
    if(cmin[i]==INF) fout<<-1<<' ';
  else fout<<cmin[i]<<' ';
  fout<<'\n';
    return 0;
}


void citire()
{ int i,j,c,m,k;
fin>>n>>m;
varf aux;
for(k=0;k<m;k++)

{   fin>>i>>j>>c;
     aux.x=j;aux.c=c;
    G[i].push_back(aux);
}}

bool BF() //returnam 0 daca nu exista solutie
{//initializare
    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 luivf
     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;


}