Pagini recente » Cod sursa (job #177001) | Cod sursa (job #2656966) | Cod sursa (job #3131021) | Cod sursa (job #685646) | Cod sursa (job #410415)
Cod sursa(job #410415)
#include <stdio.h>
#include <string.h>
#define MAX 50001
const int legn=1 << 30;
typedef int tipus;
struct adat{
tipus x,c;
adat *next;
adat(){next=0;}
};
tipus h[MAX],l[MAX],nh,n,m;
adat *a[MAX];
void sift(tipus x){
tipus fiu,temp;
do{
fiu=0;
if(x*2<=nh){
fiu=2*x;
if((2*x+1<=nh)&&(l[h[2*x+1]]<l[h[2*x]]))fiu=2*x+1;
if(l[h[x]]<l[h[fiu]]){fiu=0;}
}
if(fiu>0){
temp=h[x];
h[x]=h[fiu];
h[fiu]=temp;
x=fiu;
}
}while(fiu>0);
}
void perc(tipus x){
tipus key=h[x];
while((x>1)&&(h[x/2]>key)){
h[x]=h[x/2];
x=x/2;
}
h[x]=key;
}
void build(tipus n){
tipus i;
for(i=n/2;i>=1;i--)sift(i);
}
void add(tipus x,tipus y,tipus c){
adat *p=new adat;
p->c=c;
p->x=y;
p->next=a[x];
a[x]=p;
}
void dijk(){
adat *p=a[1];
tipus i,mini;
bool lattam[MAX];
for(i=1;i<=n;i++){
lattam[i]=0;l[i]=legn;h[i]=i+1;}
while(p!=0){l[p->x]=p->c;p=p->next;}
nh=n-1;
build(nh);
lattam[1]=1;
for(i=1;i<=n-1;i++){
mini=h[1];
h[1]=h[nh];
nh--;lattam[mini]=1;
p=a[mini];
while(p!=0){
if((!lattam[p->x])&&(p->c+l[mini]<l[p->x])){l[p->x]=p->c+l[mini];}
p=p->next;}
sift(1);
}
}
int main(){
freopen("dijkstra.in","r",stdin);
freopen("dijkstra.out","w",stdout);
tipus temp1,temp2,i,temp3;
scanf("%d %d",&n,&m);
for(i=1;i<=m;i++){
scanf("%d %d %d",&temp1,&temp2,&temp3);
add(temp1,temp2,temp3);
}
dijk();
for(i=2;i<=n;i++){
if(l[i]==legn)l[i]=0;
printf("%d ",l[i]);
}
return 0;
}