Cod sursa(job #2776679)

Utilizator bombardieruuCristi Mihai bombardieruu Data 20 septembrie 2021 17:53:01
Problema Algoritmul lui Dijkstra Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.39 kb
#include <fstream>
#include <vector>
#include <queue>

using namespace std;

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

struct heapNode{
    int nod, dist;
    inline bool operator < (const heapNode &other) const
    {
        return dist > other.dist;
    }
};

struct node{
    int nod, cost;
};

const int maxN=50000;
int nr_noduri, nr_muchii, d[maxN+5];
vector <node> G[maxN+5];
priority_queue <heapNode> heap;

void citire()
{
    fin>>nr_noduri>>nr_muchii;
    for(int i=1; i<=nr_noduri; i++)
    {
        node a, b;
        fin>>a.nod>>b.nod>>b.cost;
        G[a.nod].push_back(b);
    }
}

void dijkstra()
{
    d[1]=1;
    heapNode init;
    init.nod=1;
    init.dist=1;
    heap.push(init);
    while(!heap.empty())
    {
        heapNode poz=heap.top();
        heap.pop();
        for(int i=0; i<G[poz.nod].size(); i++)
        {
            node vecin=G[poz.nod][i];
            heapNode next;
            next.nod=vecin.nod;
            if(poz.dist+vecin.cost < d[next.nod] || d[next.nod]==0)
            {
                next.dist=poz.dist+vecin.cost;
                d[next.nod]=next.dist;
                heap.push(next);
            }
        }
    }
}

void afisare()
{
    for(int i=2; i<=nr_noduri; i++)
        fout<<d[i]-1<<' ';
}

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