Cod sursa(job #1887877)

Utilizator jordan1998Jordan jordan1998 Data 21 februarie 2017 20:04:55
Problema Algoritmul Bellman-Ford Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.81 kb
#include <cstdio>
#include <vector>
#include <algorithm>
#define buffs 1048576
using namespace std;//enq=e in h
FILE *f=freopen("bellmanford.in","r",stdin);
int d[50002],a,b,c,i,j,n,m,nod;
bool enq[50002];
char buff[buffs];
int pos=0;
long long int pas=0,lgmm;
struct gigi{int b,c;}x,y;
std::vector <gigi>h;
std::vector <gigi>v[50002];
bool cmp(gigi a,gigi b){ return(a.c>b.c);}
inline void read(int &nr)
{
    int semn=1;
    nr=0;
    while(buff[pos]<'0'||buff[pos]>'9')
        if(++pos==buffs) fread(buff,1,buffs,stdin),pos=0;
    if(buff[pos-1]=='-') semn=-1;
    while(buff[pos]>='0'&&buff[pos]<='9')
    {
        nr=(nr<<1)+(nr<<3)+buff[pos]-'0';

        if(++pos==buffs) fread(buff,1,buffs,stdin),pos=0;
    }
    nr*=semn;
}
int main()
{  fread(buff,1,buffs,stdin);
freopen("bellmanford.out","w",stdout);
  read(n);read(m);
   for(i=1;i<=m;i++)
   {
       read(a);read(x.b);read(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) printf("Ciclu negativ!");
   else
    for(i=2;i<=n;i++)
    printf("%d ",d[i]);
}