Cod sursa(job #2288266)

Utilizator BlaugranasEnal Gemaledin Blaugranas Data 22 noiembrie 2018 23:35:46
Problema Algoritmul lui Dijkstra Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.14 kb
#include<stdio.h>
#include<algorithm>
#define usi unsigned short int
const usi N=50001;
struct G {
    usi o,c;
    G *u;
};
G *g[N],*r;
int m;
usi n,k,t,i,h[N],d[N],f,w,u;
void U(usi w) {
    for(;w>1&&d[h[w>>1]]>d[h[w]];w>>=1) {
        std::swap(h[w>>1],h[w]);
    }
}
int main() {
    freopen("dijkstra.in","r",stdin),freopen("dijkstra.out","w",stdout),scanf("%d%d",&n,&m);
    while(m--) {
        scanf("%d%d%d",&u,&w,&f);
        r=new G;
        r->o=w,r->c=f,r->u=g[u],g[u]=r;
    }
    for(i=2;i<=n;i++)
        d[i]=N;
    for(h[++k]=1;k;) {
        for(t=h[1],h[1]=h[k--],w=1;w<=k;) {
            f=w;
            if((w<<1)>k)
                break;
            f=w<<1;
            if(f+1<=k&&d[h[f+1]]<d[h[f]])
                f++;
            if(d[h[w]]<=d[h[f]])
                break;
            std::swap(h[w],h[f]),w=f;
        }
        for(r=g[t];r;r=r->u) {
            if(d[r->o]>d[t]+r->c) {
                d[r->o]=d[t]+r->c;
                if(r->o>t)
                    U(r->o);
                else
                    h[++k]=r->o,U(k);
            }
        }
    }
    for(i=2;i<=n;i++)
        printf("%d ",d[i]==N?0:d[i]);
}