Cod sursa(job #1362553)

Utilizator zpaePopescu Andreea zpae Data 26 februarie 2015 13:34:44
Problema Algoritmul lui Dijkstra Scor 80
Compilator cpp Status done
Runda Arhiva educationala Marime 1.68 kb
#include <cstdio>
#include <vector>
#include <algorithm>
using namespace std;
#define INF 429496729100
#define N 50002
int n,m,nn,h[N],p[N];
vector <int> f[N],v[N];
long long d[N];

void heap_swap(int x,int y)
{
    swap(h[x],h[y]);
    p[h[x]]=x;
    p[h[y]]=y;
}

void heap_up(int k)
{
    if(k>1&&d[h[k]]<d[h[k/2]])
    {
        heap_swap(k,k/2);
        heap_up(k/2);
    }
}

void heap_down(int x)
{
    if(2*x+1<=n)
    {
        if(d[h[x]]>d[h[2*x]]&&d[h[2*x]]<=d[h[2*x+1]])
        {
            heap_swap(x,2*x);
            heap_down(2*x);
        }
        if(d[h[x]]>d[h[2*x+1]]&&d[h[2*x+1]]<=d[h[2*x]])
        {
            heap_swap(x,2*x+1);
            heap_down(2*x+1);
        }
    }
    if(2*x<=n&&d[h[x]]>d[h[2*x]])
    {
         heap_swap(x,2*x);
         heap_down(2*x);
    }
}

int main()
{
    freopen("dijkstra.in","r",stdin);
    freopen("dijkstra.out","w",stdout);
    int i,x,y,k;
    scanf("%d%d",&n,&m);
    nn=n;
    for(i=1;i<=m;i++)
    {
        scanf("%d%d%d",&x,&y,&k);
        f[x].push_back(y);
        v[x].push_back(k);
    }
    for(i=1;i<=n;i++)
    {
        h[i]=i;
        d[i]=INF;
        p[i]=i;
    }
    d[1]=0;
    n=n-2;
    while(n)
    {
        x=h[1];
        heap_swap(1,n);
        n--;
        heap_down(1);
        for(i=0;i<f[x].size();i++)
            if((v[x][i]+d[x])<d[f[x][i]])
            {
                d[f[x][i]]=v[x][i]+d[x];
                heap_up(p[f[x][i]]);
            }
    }
    for(i=2;i<=nn;i++)
    {
        if(d[i]==INF)
            printf("0 ");
        else
            printf("%lld ",d[i]);
    }
    printf("\n");
    return 0;
}