Cod sursa(job #2806628)

Utilizator amalia.gemanGeman Aamalia amalia.geman Data 22 noiembrie 2021 20:52:43
Problema Algoritmul lui Dijkstra Scor 50
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.07 kb
#include <bits/stdc++.h>
#define Nmax 50005

using namespace std;


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


const int inf = (1 << 30);


priority_queue <pair<int,int>> q;   // coada cu prioritati {cost,nod}
vector <pair<int,int>> muchii[Nmax];
bool viz[Nmax];                     // viz[x] = 1 daca nodul a fost vizitat
int N, M, dist[Nmax];               // nr noduri, nr muchii, dist[x] = distanta de la nodul de start la nodul x


void Read()
{
    fin >> N >> M;

    for(int i = 1; i <= M; ++i)
    {
        int x, y, cost;
        fin >> x >> y >> cost;
        muchii[x].push_back({cost,y});
    }

    // initial presupunem fiecare distanta ca fiind infinit
    for(int i = 1; i <= N; ++i)
        dist[i] = inf;
}


void Dijkstra(int s)
{
    q.push({0,s});  // adaugam in coada nodul de inceput cu costul 0 (de la s la s avem distanta 0)
    viz[s] = 1;     // marcam nodul ca fiind vizitat
    dist[s] = 0;    // distanta de la s la s va fi 0

    while(!q.empty())
    {
        int nod_curent = q.top().second;    // nodul curent
        // int cost = q.top().first; // costul
        q.pop();

        viz[nod_curent] = 0; // presupunem ca nodul curent nu a fost vizitat inca

        for(auto i : muchii[nod_curent])  // parcurgem nodurile adiacente cu nodul curent
        {
            int y = i.second;      // nodul adiacent cu nodul curent
            int cost = i.first;    // costul de la nodul curent  pana la y

            if(dist[nod_curent] + cost < dist[y])
            {
                dist[y] = dist[nod_curent] + cost;
                if(!viz[y]) // marcam nodul ca fiind vizitat daca nu era
                {
                    viz[y] = 1;
                    q.push({dist[y],y});
                }
            }
        }
    }
}

void Afisare()
{
    for(int i = 2; i <= N; ++i)
    {
        if(dist[i] != inf)
            fout << dist[i] << " ";
        else
            fout << 0 << " ";
    }
}

int main()
{
    Read();
    Dijkstra(1);
    Afisare();

    return 0;
}