Pagini recente » Istoria paginii runda/gdrgasd/clasament | Cod sursa (job #197959) | Cod sursa (job #1006786) | Cod sursa (job #3134664) | Cod sursa (job #155733)
Cod sursa(job #155733)
#include <stdio.h>
#define NM 500001
#define INF 0xfffffff
long n,m,nr;
long poz[NM];
struct cheste{long x;long nod;} d[NM];
struct lista {long cost,vec;lista *urm;} *g[NM];
void swap(long x,long y)
{ cheste aux2=d[x];
d[x]=d[y];
d[y]=aux2;
long aux=poz[d[x].nod];
poz[d[x].nod]=poz[d[y].nod];
poz[d[y].nod]=aux;
}
void heap_up(long nod)
{ if (nod==1) return;
if (d[nod].x<d[nod/2].x)
{ swap(nod,nod/2);
heap_up(nod/2);
}
}
void heap_down(int nod)
{ long st=nod*2;
long dr=nod*2+1;
if (st>nr) return;
if (dr>nr)
{ if (d[nod].x>d[st].x) swap(st,nod);
return;
}
if (d[nod].x>d[st].x&&d[st].x<d[dr].x)
{ swap(st,nod);
heap_down(st);
}
else if(d[nod].x>d[dr].x&&d[dr].x<d[st].x)
{ swap(dr,nod);
heap_down(dr);
}
}
long hpop_min()
{ long min=d[1].nod;
swap(1,nr);
nr--;
heap_down(1);
return min;
}
void dijkstra()
{ int i,min;
for (i=1;i<=n-1;i++) { d[i].x=INF;d[i].nod=i+1;poz[i+1]=i;}
lista *p;
for (p=g[1];p;p=p->urm)
{ d[poz[p->vec]].x=p->cost;
heap_up(poz[p->vec]);
}
for (nr=n-1;nr>0;)
{ min=hpop_min();
for (p=g[min];p;p=p->urm)
{ if (p->cost+d[poz[min]].x<d[poz[p->vec]].x)
{ d[poz[p->vec]].x=p->cost+d[poz[min]].x;
heap_up(poz[p->vec]);
}
}
}
}
int main()
{ freopen("dijkstra.in","rt",stdin);
freopen("dijkstra.out","wt",stdout);
scanf("%ld %ld",&n,&m);
long i,a,b,c;
lista *p;
for (i=1;i<=m;i++)
{ scanf("%ld %ld %ld",&a,&b,&c);
p=new lista;
p->cost=c;
p->vec=b;
p->urm=g[a];
g[a]=p;
}
dijkstra();
for (i=2;i<=n;i++)
if (d[poz[i]].x==INF) printf("0 ");
else printf("%ld ",d[poz[i]].x);
return 0;
}