Cod sursa(job #1735629)

Utilizator delta_wolfAndrei Stoica delta_wolf Data 30 iulie 2016 14:45:37
Problema Algoritmul lui Dijkstra Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.81 kb
#include <cstdio>
#include<vector>
#define nmax 50003
#define inf 999999999
using namespace std;
int n,m,nh;
int heap[nmax],d[nmax],poz[nmax];
vector<int>graf[nmax],costuri[nmax];



void swap(int i,int j)
{
    int aux;
    aux=heap[i];
    heap[i]=heap[j];
    heap[j]=aux;
    poz[heap[i]]=i;
    poz[heap[j]]=j;
}


int out_from_heap()
{
    swap(1, nh);
    poz[heap[nh]] = 0;
    nh--;
    return heap[nh + 1];
}

void heap_down(int nod)
{
    int i=2*nod;
    if(i<=nh)
    {
        if(i+1<=nh&&d[heap[i+1]]<d[heap[i]])
            i++;
         if (d[heap[i]]<d[heap[nod]])
        {
            swap(i,nod);
            heap_down(i);
        }
    }
}




void heap_up(int nod)
{
    if(nod<=1)
        return;

    int f=nod/2;

    if (d[heap[nod]]<d[heap[f]])
    {
        swap(f,nod);
        heap_up(f);
    }

}


void dij_heap(int nod)
{
    int p;
    for(int i=1;i<=n;i++)
        d[i]=inf,
        heap[i]=i,
        poz[i]=i;
    d[nod]=0;
    nh=n;
    while(nh)
    {
        p=out_from_heap();
        heap_down(1);
        for(int i=0;i<graf[p].size();i++)
        {
            if(d[graf[p][i]]>d[p]+costuri[p][i]&&poz[graf[p][i]])
            {
                d[graf[p][i]]=d[p]+costuri[p][i];

                heap_up(poz[graf[p][i]]);
            }
        }
    }
}

int main()
{
    freopen("dijkstra.in","r",stdin);
    freopen("dijkstra.out","w",stdout);
    scanf("%d%d",&n,&m);
    for(int i=1,x,y,z;i<=m;i++)
    {
        scanf("%d%d%d",&x,&y,&z);
        graf[x].push_back(y);
        graf[y].push_back(x);
        costuri[x].push_back(z);
        costuri[y].push_back(z);
    }
    dij_heap(1);
    for(int i=2;i<=n;i++)
    {
        if(d[i]==inf)d[i]=0;
        printf("%d ",d[i]);
    }
    return 0;
}