Pagini recente » Cod sursa (job #1454019) | Cod sursa (job #1484718) | Cod sursa (job #2119466) | Cod sursa (job #2175089) | Cod sursa (job #1887877)
#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]);
}