Pagini recente » Rating Madalina Zurini (madalinaz) | Cod sursa (job #302840) | Cod sursa (job #3214976) | Cod sursa (job #1081853) | Cod sursa (job #401868)
Cod sursa(job #401868)
using namespace std;
#include<cstdio>
#include<fstream>
#include<iostream>
#define MAX 50005
#define INFINIT 1073741823
#define heap H
inline int father(int k){
return k/2;}
inline int left_son(int k){
return k*2;}
inline int right_son(int k){
return k*2+1;}
struct nod{
int capat,cost;
nod *next;
};
nod *G[MAX];
int H[MAX],d[MAX],v[MAX],nH,n,t[MAX],poz[MAX];
void addArc(int x,int y,int c)
{
nod *p=new nod;
p->cost=c;
p->capat=y;
p->next=G[x];
G[x]=p;
}
void cerne(int k)
{
int son;
do
{
son=0;
if(left_son(k)<=n)
{
son=left_son(k);
if(right_son(k)<=n && d[heap[right_son(k)]]<d[heap[son]])
son=right_son(k);
if(d[heap[son]]<=d[heap[k]])
son=0;
}
if(son)
{
swap(heap[son],heap[k]);
swap(poz[heap[son]],poz[heap[k]]);
k=son;
}
}while(son);
}
void promoveaza(int k)
{
while(k>1 && d[heap[father(k)]]> d[heap[k]])
{
swap(heap[father(k)],heap[k]);
swap(poz[heap[father(k)]],poz[heap[k]]);
k=father(k);
}
}
void init(int sursa)
{
int i;
for(i=0;i<=n;i++)
v[i]=0,d[i]=INFINIT,t[i]=-1,H[i]=i,poz[i]=i;
nH=n;
v[sursa]=1,d[sursa]=0,t[sursa]=0;
H[sursa]=H[nH--];
poz[H[sursa]]=sursa;
cerne(sursa);
for(nod *p=G[sursa]; p ; p=p->next)
{
d[p->capat]=p->cost;
t[p->capat]=sursa;
promoveaza(poz[p->capat]);
}
}
void dijkstra(int sursa)
{
init(sursa);
for(int qq=1;qq<n;qq++)
{
int pmin=H[1];
if(d[pmin]==INFINIT)
break;
v[pmin]=1;
H[1]=H[nH--];
poz[H[1]]=1;
cerne(1);
for(nod *p=G[pmin] ; p ; p=p->next)
if((d[pmin] + p->cost) < d[p->capat])
{
t[p->capat]=pmin;
d[p->capat]=d[pmin]+p->cost;
promoveaza(poz[p->capat]);
}
}
}
int main()
{
int i,m;
freopen("dijkstra.in","r", stdin);
freopen("dijkstra.out","w", stdout);
scanf("%d %d", &n, &m);
for(i=1;i<=m;i++)
{
int x,y,c;
scanf("%d %d %d", &x, &y, &c);
addArc(x,y,c);
}
dijkstra(1);
for(i=2;i<=n;i++)
{
if(d[i]!=INFINIT)
printf("%d ", d[i]);
else
printf("0 ");
}
return 0;
}