Cod sursa(job #1887813)

Utilizator jordan1998Jordan jordan1998 Data 21 februarie 2017 19:32:30
Problema Algoritmul Bellman-Ford Scor 35
Compilator cpp Status done
Runda Arhiva educationala Marime 1.33 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <algorithm>
using namespace std;//enq=e in h
int d[50002],a,b,c,i,j,n,m,nod;
bool enq[50002];
long long int pas=0,lgmm;
struct gigi{int b,c;}x,y;
std::vector <gigi>h;
std::vector <gigi>v[50002];
ifstream f("bellmanford.in");
ofstream g("bellmanford.out");
bool cmp(gigi a,gigi b){ return(a.c<b.c);}
int main()
{
   f>>n>>m;
   for(i=1;i<=m;i++)
   {
       f>>a>>x.b>>x.c;
       v[a].push_back(x);
   }
   d[1]=0;
   for(i=2;i<=n;i++)
    d[i]=50000003;
    x.b=1;x.c=0;
   h.push_back(x);
   make_heap(h.begin(),h.end(),cmp);
   enq[1]=true;
   lgmm=1LL*m*n+1;
   while(!h.empty()&&pas<=lgmm)
   {
       pas++;
       pop_heap(h.begin(),h.end(),cmp);
       x=h.back();
       nod=x.b;
       h.pop_back();
       enq[nod]=false;
       b=v[nod].size();
       for(j=0;j<b;j++)
        if(d[v[nod][j].b]>d[nod]+v[nod][j].c)
        {
            d[v[nod][j].b]=d[nod]+v[nod][j].c;
            if(!enq[v[nod][j].b])
            {
                enq[v[nod][j].b]=true;
                y.b=v[nod][j].b;
                y.c=d[v[nod][j].b];
                h.push_back(y);
                push_heap(h.begin(),h.end(),cmp);
            }
        }

   }
  if(pas>=lgmm) g<<"Ciclu negativ!";
   else
    for(i=2;i<=n;i++)
    g<<d[i]<<" ";
}