Cod sursa(job #3145529)

Utilizator SSKMFSS KMF SSKMF Data 16 august 2023 09:08:29
Problema Algoritmul lui Dijkstra Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.45 kb
#include <fstream>
#include <vector>
#include <queue>
using namespace std;

ifstream cin ("dijkstra.in");
ofstream cout ("dijkstra.out");

vector < pair <int , int> > adiacenta[50001];
long long distanta[50001];
bool adaugat[50001];

int main ()
{
    int noduri , arce;
    cin >> noduri >> arce;

    for (int indice = 1 , nod[2] , cost ; indice <= arce ; indice++)
        { cin >> nod[0] >> nod[1] >> cost; adiacenta[nod[0]].emplace_back(make_pair(nod[1] , cost)); }

    for (int indice = 2 ; indice <= noduri ; indice++)
        distanta[indice] = 1e9;

    priority_queue < pair <int , int> > optiuni;
    optiuni.push(make_pair(0 , 1));
    while (!optiuni.empty())
    {
        const int nod_actual = optiuni.top().second; optiuni.pop();
        for (auto nod_vecin : adiacenta[nod_actual])
            if (distanta[nod_actual] + nod_vecin.second < distanta[nod_vecin.first])
            {
                distanta[nod_vecin.first] = distanta[nod_actual] + nod_vecin.second;

                if (!adaugat[nod_vecin.first]) { 
                    optiuni.push(make_pair(-distanta[nod_vecin.first] , nod_vecin.first)); 
                    adaugat[nod_vecin.first] = true; 
                }
            }

        adaugat[nod_actual] = false;
    }

    for (int indice = 2 ; indice <= noduri ; indice++)
        cout << (distanta[indice] == 1e9 ? 0 : distanta[indice]) << ' ';

    cout.close(); cin.close();
    return 0;
}