Pagini recente » Cod sursa (job #1391715) | Cod sursa (job #2602821) | Cod sursa (job #1078755) | Cod sursa (job #3143947) | Cod sursa (job #1713315)
#include <stdio.h>
#define nod 50005
#define muchie 250005
#define inf 2000000000
struct legaturi{int vecin,lg;};
legaturi v[muchie];
int next[muchie],lista[nod],d[nod],heap[nod],ind[nod],k;
int tata(int p){return (p-1)/2;}
int fiust(int p){return 2*p+1;}
int fiudr(int p){return 3*p+2;}
void schimba(int p,int q){
int aux=heap[p];
heap[p]=heap[q];
heap[q]=aux;
ind[heap[p]]=p;
ind[heap[q]]=q;
}
void urcare(int p){
while(p>0&&d[heap[p]]<d[heap[tata(p)]]){
schimba(p,tata(p));
p=tata(p);
}
}
void coborare(int p){
bool pp=true;
int q;
while(pp==true&&fiust(p)<k){
q=fiust(p);
if(fiudr(p)<k&&d[heap[fiudr(p)]]<d[heap[p]]){
schimba(p,q);
p=q;
}
else
pp=false;
}
}
void adaugare(int x){
heap[k]=x;
ind[x]=k;
urcare(k);
k++;
}
void stergere(int x){
int p=ind[x];
schimba(k-1,p);
k--;
if(d[heap[p]]<d[heap[tata(p)]])
urcare(p);
else
coborare(p);
}
int main(){
FILE *fin,*fout;
fin=fopen("dijkstra.in","r");
fout=fopen("dijkstra.out","w");
int i,n,m,poz,elem;
fscanf(fin,"%d%d",&n,&m);
for(i=1;i<=m;i++){
fscanf(fin,"%d%d%d",&elem,&v[i].vecin,&v[i].lg);
if(lista[elem]==0)
lista[elem]=i;
else{
next[i]=lista[elem];
lista[elem]=i;
}
}
d[1]=0;
for(i=2;i<=n;i++){
d[i]=inf;
ind[i]=-1;
}
adaugare(1);
while(k!=0){//k=nr elem in heap
elem=heap[0];
stergere(heap[0]);
poz=lista[elem];
while(v[poz].vecin!=0){
if(d[elem]+v[poz].lg<d[v[poz].vecin]){
d[v[poz].vecin]=d[elem]+v[poz].lg;
if(ind[v[poz].vecin]!=-1){
urcare(ind[v[poz].vecin]);
coborare(ind[v[poz].vecin]);
}
else
adaugare(v[poz].vecin);
}
poz=next[poz];
}
}
for(i=2;i<=n;i++)
if(d[i]==inf)
fprintf(fout,"0 ");
else
fprintf(fout,"%d ",d[i]);
fclose(fin);
fclose(fout);
return 0;
}