Cod sursa(job #2118659)

Utilizator RG1999one shot RG1999 Data 30 ianuarie 2018 20:42:23
Problema Algoritmul lui Dijkstra Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.88 kb
#include <bits/stdc++.h>

using namespace std;
int Heap[50001],cst[50001],len,x,y,z,i,n,m,mn,pos[50001],a;
vector < int > v[50001];
map <pair <int,int> , int> mp;
inline int father(int nod)
{
    return nod/2;
}
inline int leftson(int nod)
{
    return 2*nod;
}
inline int rightson(int nod)
{
    return 2*nod+1;
}
int son (int nod)
{
    if(cst[Heap[leftson(nod)]]<cst[Heap[nod]])
        if(cst[Heap[leftson(nod)]]<=cst[Heap[rightson(nod)]])
        return leftson(nod);
    if(cst[Heap[rightson(nod)]]<cst[Heap[nod]])
        if(cst[Heap[leftson(nod)]]>=cst[Heap[rightson(nod)]])
        return rightson(nod);
    return 0;
}
int down (int nod)
{
    while(son(nod))
    {
        swap(Heap[nod],Heap[son(nod)]);
         swap(pos[Heap[nod]],pos[Heap[son(nod)]]);
        nod=son(nod);
    }
}
int up (int nod)
{
    while(cst[Heap[father(nod)]]>cst[Heap[nod]])
    {
      swap(Heap[father(nod)],Heap[nod]);
        swap(pos[Heap[nod]],pos[Heap[father(nod)]]);
      nod=father(nod);
    }
}
int del (int nod)
{
    Heap[nod]=Heap[len];
    swap(pos[Heap[nod]],pos[Heap[len]]);
    len--;
    down(nod);
}

int main()
{
    freopen("dijkstra.in","r",stdin);
    freopen("dijkstra.out","w",stdout);
    scanf("%d%d",&n,&m);
    for(i=1;i<=m;i++)
    {
        scanf("%d%d%d",&x,&y,&z);
        v[x].push_back(y);
        mp[{x,y}]=z;

    }
    for(i=1;i<=n;i++) Heap[i]=i,pos[i]=i;
    cst[1]=0;
    for(i=2;i<=n;i++)
        cst[i]=999999;
    len=n;
    while(len)
    {
        mn=Heap[1];
        del(1);

        for(i=0;i<=v[mn].size()-1;i++)
        if(cst[mn]+mp[{mn,v[mn][i]}]<cst[v[mn][i]])
            {
                   a=v[mn][i];
                cst[v[mn][i]]=cst[mn]+mp[{mn,v[mn][i]}];
                up(pos[v[mn][i]]);
            }

    }
    for(i=2;i<=n;i++)
        printf("%d ",cst[i]);



    return 0;
}