Pagini recente » Cod sursa (job #2477583) | Cod sursa (job #2285953) | Cod sursa (job #831427) | Cod sursa (job #309008) | Cod sursa (job #1712079)
#include <cstdio>
#define MAXN 50000
#define MAXM 250000
#define INF 250000001
int k, r, poz[MAXN+1], lista[MAXN+1], next[MAXM+1], val[MAXM+1], d[MAXM+1], heap[MAXN+1], dist[MAXN+1];
inline void adauga(int x, int y, int l)
{
val[++r]=y;
next[r]=lista[x];
lista[x]=r;
d[r]=l;
}
inline int father(int x){ return x/2;};
inline int son_left(int x){ return x*2;};
inline int son_right(int x){ return x*2+1;};
inline void swap(int a, int b)
{
int aux=heap[a];
poz[heap[a]]=b;
poz[heap[b]]=a;
heap[a]=heap[b];
heap[b]=aux;
}
inline void up(int x)
{
int p, f=1;
while(father(x) && f)
{
f=0;
p=father(x);
if(dist[heap[p]]>dist[heap[x]])
{
swap(p, x);
f=1;
}
x=p;
}
}
inline void down(int x)
{
int p,q, f=1;
while(son_left(x)<=k && f)
{
f=0;
p=son_left(x);
q=son_right(x);
if(q<=k && dist[heap[q]] < dist[heap[p]])
p=q;
if(dist[heap[p]] < dist[heap[x]])
{
f=1;
swap(p, x);
}
x=p;
}
}
inline void add(int nod)
{
heap[++k]=nod;
up(k);
}
inline void delete1()
{
swap(1, k);
k--;
}
inline void dijkstra()
{
int nod, p, vecin;
add(1);
poz[1]=1;
while(k)
{
nod=heap[1];
p=lista[nod];
delete1();
poz[nod]=-1;
while(p)
{
vecin=val[p];
if(dist[vecin] > dist[nod]+d[p])
{
dist[vecin]=dist[nod]+d[p];
if(poz[vecin] != -1)
up(poz[vecin]);
else add(vecin);
}
p=next[p];
}
}
}
int main()
{
freopen("dijkstra.in", "r", stdin);
freopen("dijkstra.out", "w", stdout);
int n, m,x, y, l;
scanf("%d%d", &n, &m);
for(int i=1;i<=m;++i)
{
scanf("%d%d%d", &x, &y, &l);
adauga(x, y, l);
}
for(int i=2;i<=n;++i){
dist[i]=INF;
poz[i]=-1;
}
dijkstra();
for(int i=2;i<=n;++i)
{
if(dist[i]==INF)
printf("0 ");
else printf("%d ", dist[i]);
}
return 0;
}