Cod sursa(job #1564838)

Utilizator AlexVolatiluVoicu Alex AlexVolatilu Data 9 ianuarie 2016 23:19:52
Problema Algoritmul lui Dijkstra Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 1.69 kb
#include <stdio.h>
#include <vector>
#define INF 2147483647

using namespace std;

struct vecin
{
    int nod,cost;
}auxve;

int n,m,nh;
int d[50001],heap[50001],poz[50001];
vector<vecin> v[50001];
vector<vecin>::const_iterator itr,fin;

void swag(int i,int j) //u don't have it
{
    int aux;
    aux=heap[j];
    heap[j]=heap[i];
    heap[i]=aux;
    poz[heap[j]]=i;
    poz[heap[i]]=j;
}

void heapup(int k)
{
    int j,aux;
    while(k>1)
    {
        j=k/2;
        if(d[heap[j]]>d[heap[k]]) {swag(j,k);k=j;}
        else break;
    }
}

int heapout()
{
    int j,k,i=1;
    swag(1,nh);
    nh--;
    while(2*i<=nh)
    {
        j=2*i;
        if(d[heap[j]]>d[heap[j+1]]&&j+1<=nh) j++;
        if(d[heap[i]]>d[heap[j]]) {swag(i,j);i=j;}
        else break;
    }
    return heap[nh+1];
}

int main()
{
    freopen("dijkstra.in","r",stdin);
    freopen("dijkstra.out","w",stdout);
    int i,j,a,b;
    scanf("%d%d",&n,&m);
    for(i=0;i<=n;i++)
        d[i]=INF;
    d[1]=0;
    nh=n;
    for(i=0;i<m;i++)
    {
        scanf("%d%d%d",&a,&(auxve.nod),&(auxve.cost));
        v[a].push_back(auxve);
    }
    for(i=1;i<=n;i++)
    {
        heap[i]=i;
        poz[i]=i;
    }
    while(nh>0)
    {
        i=heapout();
        itr=v[i].begin();
        fin=v[i].end();
        for(;itr!=fin;itr++)
        {
            a=(*itr).nod;
            b=(*itr).cost;
            if(d[i]!=INF&&d[a]>d[i]+b)
            {
                d[a]=d[i]+b;
                heapup(poz[a]);
            }
        }
    }

    for(i=2;i<=n;i++)
    {
        if(d[i]!=INF) printf("%d ",d[i]);
        else printf("0 ");
    }

    return 0;
}