Cod sursa(job #1886979)

Utilizator patrutoiuandreipatrutoiu andrei patrutoiuandrei Data 21 februarie 2017 11:52:40
Problema Algoritmul lui Dijkstra Scor 20
Compilator cpp Status done
Runda Arhiva educationala Marime 1.82 kb
#include <fstream>
#include <vector>

#define Ndim 50001
using namespace std;
ifstream fin("dijkstra.in");
ofstream fout("dijkstra.out");
int V[Ndim],P[Ndim],H[Ndim],hdim;
vector < pair <int,int> > G[Ndim];
void up(int nod)
{
    int tata = nod/2;
    while(nod!=1 && V[H[nod]] < V[H[tata]])
    {
        swap(H[nod],H[tata]);
        swap(P[H[nod]],P[H[tata]]);
        nod/=2;
        tata/=2;
    }
}
void down(int nod)
{
    int fiu = 2*nod;
    while(fiu <= hdim)
    {
        if(fiu+1<=hdim && V[H[fiu]]>V[H[fiu+1]])
            fiu++;
        if(V[H[nod]] > V[H[fiu]])
        {
            swap(H[nod],H[fiu]);
            swap(P[H[nod]],P[H[fiu]]);
            nod = fiu;
            fiu = 2*nod;
        }
        else
            break;
    }

}
void heap_insert(int poz)
{
    H[++hdim] = poz;
    P[poz] = hdim;
    up(hdim);
}
int heap_extract()
{
    int nod = H[1];
    H[1] = H[hdim];
    P[H[1]] = 1;
    --hdim;
    down(1);
    return nod;
}
int main()
{
    int n,m,i,fiu,c,nod,a,b,j;
    fin>>n>>m;
    for(i=1;i<=m;i++)
    {
        fin>>a>>b>>c;
        G[a].push_back(make_pair(b,c));
        G[b].push_back(make_pair(a,c));
    }
    for(i=2;i<=n;i++)
        V[i] = -1;
    heap_insert(1);
    for(i=1;i<=n;i++)
    {
        nod = heap_extract();
        for(j=0;j<G[nod].size();j++)
        {
            fiu = G[nod][j].first;
            c = G[nod][j].second;
            if(V[fiu]>V[nod]+c || V[fiu]==-1)
            {
                V[fiu] = V[nod]+c;
                if(P[fiu] == 0)
                    heap_insert(fiu);
                else
                    up(P[fiu]);
            }
        }
    }
    for(i=2;i<=n;i++)
        if(V[i]!=-1)
            fout<<V[i]<<' ';
        else
            fout<<0<<' ';
    return 0;
}