Cod sursa(job #2365246)

Utilizator potlog.liviu.andreiPotlog Liviu-Andrei potlog.liviu.andrei Data 4 martie 2019 12:40:28
Problema Algoritmul Bellman-Ford Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.51 kb
#include <fstream>       // cout
#include <queue>          // queue
#include <vector>
#define NMAX 50002
#define INF 1000000000

using namespace std;
ifstream fin("bellmanford.in");
ofstream fout("bellmanford.out");

int n,start=1;
struct varf{int x; int c;};
vector<varf>G[NMAX];
int cmin[NMAX]; //cmin[x]=costul drumului de cost minim de la start la x;
int nr[NMAX];   // nr[x]=de cate ori a fost actualizat un drum de cost minim de la start la x;
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,c,m,k;
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()
//returnam 0 daca nu exista solutie, si 1`daca exista solutie;
{int i,vf;
//initializare
for(i=1;i<=n;i++) cmin[i]=INF;
cmin[start]=0;
C.push(start);
while(!C.empty())
    {
    vf=C.front();
    C.pop();
    //parcurd lista de adiacenta a lui vf;
    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;
}