Cod sursa(job #2722589)

Utilizator Mihai_EduardMihai Eduard Mihai_Eduard Data 13 martie 2021 00:04:51
Problema Algoritmul lui Dijkstra Scor 10
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.09 kb
#include <iostream>
#include <fstream>
#include <vector>

#define MX 50001
#define inf 2147483647

using namespace std;

ifstream fin("dijkstra.in");
ofstream fout("dijkstra.out");

int n, m;
vector < pair<int,int> > v[MX];
int L, H[MX], poz[MX], dist[MX];

void citire()
{
    fin>>n>>m;
    int x, y, z;
    for(int i=1;i<=n;i++)
    {
        fin>>x>>y>>z;
        v[x].push_back({y,z});
    }
    fin.close();
}

void actualizare(int p)
{
    while(p>1 and dist[H[p]]<dist[H[p/2]])
    {
        swap(H[p],H[p/2]);
        swap(poz[H[p]],poz[H[p/2]]);
        p=p/2;
    }
}

void push_MinHeap(int nod)
{
    H[++L]=nod;
    poz[nod]=L;
    actualizare(L);
}

int radacina_MinHeap()
{
    int rad=H[1];
    swap(H[1],H[L]);
    swap(poz[H[1]],poz[H[L]]);
    L--;
    int p=1;
    while((2*p<=L and dist[H[p]]>dist[H[2*p]]) or (2*p+1<=L and dist[H[p]]>dist[H[2*p+1]]))
    {
        if(2*p+1>L or dist[H[2*p]]<dist[H[2*p+1]])
        {
            swap(H[p],H[2*p]);
            swap(poz[H[p]],poz[H[2*p]]);
            p=p*2;
        }
        else
        {
            swap(H[p],H[2*p+1]);
            swap(poz[H[p]],poz[H[2*p+1]]);
            p=p*2+1;
        }
    }
    return rad;
}

void Dijkstra()
{
    for(int i=2;i<=n;i++)
        dist[i]=inf;
    dist[1]=0;

    push_MinHeap(1);

    int next;
    while(L)
    {
        next=radacina_MinHeap();
        for(unsigned int i=0;i<v[next].size();i++)
        {
            if(dist[v[next][i].first]>dist[next]+v[next][i].second)
            {
                dist[v[next][i].first]=dist[next]+v[next][i].second;
                if(poz[v[next][i].first]==0)
                    push_MinHeap(v[next][i].first);
                else
                    actualizare(poz[v[next][i].first]);
            }
        }
    }
}

void afisare()
{
    for(int i=2;i<=n;i++)
    {
        if(dist[i]==inf)
            fout<<0<<' ';
        else
            fout<<dist[i]<<' ';
    }
    fout.close();
}

int main()
{
    citire();
    Dijkstra();
    afisare();
    return 0;
}