Cod sursa(job #1713315)

Utilizator AnaRaduAna-Maria Radu AnaRadu Data 5 iunie 2016 11:51:58
Problema Algoritmul lui Dijkstra Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 2.24 kb
#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;
}