Cod sursa(job #1712074)

Utilizator antanaAntonia Boca antana Data 1 iunie 2016 22:25:28
Problema Algoritmul lui Dijkstra Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 2.14 kb
#include <cstdio>
#define MAXN 50000
#define MAXM 250000
#define INF 250000001

int k, r, lista[MAXN+1], next[MAXM+1], val[MAXM+1], d[MAXM+1], heap[MAXN+1], dist[MAXN+1];
inline void adauga(int x, int y, int l)
{
    val[++r]=y;
    next[r]=lista[x];
    lista[x]=r;
    d[r]=l;
}
inline int minim(int a, int b)
{
    if(a<b)
        return a;
    return b;
}
inline int father(int x){ return x/2;};
inline int son_left(int x){ return x*2;};
inline int son_right(int x){ return x*2+1;};
inline void swap(int a, int b)
{
    int aux=heap[a];
    heap[a]=heap[b];
    heap[b]=aux;
}
inline void up(int x)
{
    int p, f=1;
    while(father(x) && f)
    {
        f=0;
        p=father(x);
        if(dist[heap[p]]>dist[heap[x]])
        {
            swap(p, x);
            f=1;
        }
        x=p;
    }
}
inline void down(int x)
{
    int p,q, f=1;
    while(son_left(x)<=k && f)
    {
        f=0;
        p=son_left(x);
        q=son_right(x);
        if(q<=k && dist[heap[q]] < dist[heap[p]])
            p=q;
        if(dist[heap[p]] < dist[heap[x]])
        {
            f=1;
            swap(p, x);
        }
        x=p;
    }
}
inline void add(int nod)
{
    heap[++k]=nod;
    up(k);
}
inline void delete1()
{
    swap(1, k);
    k--;
}
inline void dijkstra()
{
    int nod, p, vecin;
    add(1);
    while(k)
    {
        nod=heap[1];
        p=lista[nod];
        delete1();
        while(p)
        {
            vecin=val[p];
            if(dist[vecin] > dist[nod]+d[p])
            {
                dist[vecin]=dist[nod]+d[p];
                add(vecin);
            }
            p=next[p];
        }
    }
}
int main()
{
    freopen("dijkstra.in", "r", stdin);
    freopen("dijkstra.out", "w", stdout);
    int n, m,x, y, l;
    scanf("%d%d", &n, &m);
    for(int i=1;i<=m;++i)
    {
        scanf("%d%d%d", &x, &y, &l);
        adauga(x, y, l);
    }
    for(int i=2;i<=n;++i)
        dist[i]=INF;
    dijkstra();
    for(int i=2;i<=n;++i)
    {
        if(dist[i]==INF)
            printf("0 ");
        else printf("%d ", dist[i]);
    }
    return 0;
}