Pagini recente » Cod sursa (job #1436100) | Cod sursa (job #1347926) | Cod sursa (job #1278094) | Cod sursa (job #3211220) | Cod sursa (job #155865)
Cod sursa(job #155865)
#include <stdio.h>
#define NM 50001
#define INF 0xfffffff
long n,m,nr;
long poz[NM],viz[NM];
struct cheste{long x;long nod;} d[NM];
struct lista {long cost,vec;lista *urm;} *g[NM];
void swap(long x,long y)
{ poz[d[x].nod]=y;
poz[d[y].nod]=x;
cheste aux2=d[x];
d[x]=d[y];
d[y]=aux2;
}
void heap_up(long nod)
{ if (nod==1) return;
int t=nod>>1;
if (d[nod].x<d[t].x)
{ swap(nod,t);
heap_up(t);
}
}
void heap_down(int nod)
{ long st=nod<<1;
long dr=st+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;}
viz[1]=1;
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();
viz[min]=1;
for (p=g[min];p;p=p->urm)
{ if (!viz[p->vec]&&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;
}