Cod sursa(job #2808807)

Utilizator 6kmeleon6Luca Cordus 6kmeleon6 Data 25 noiembrie 2021 16:18:17
Problema Algoritmul lui Dijkstra Scor 90
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.41 kb
#include <bits/stdc++.h>
#include <limits>

using namespace std;

int infinit = std::numeric_limits<int>::max();

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

vector<pair<int,int>> costuri[100001];
int V[100001], dist[100001];

void dijkstra()
{
    dist[1]=0;

    priority_queue<pair<int,int>> H; /// Va sorta singur in functie de cea mai mica distanta
    H.push({0,1});

    while(H.size() > 0)
    {

        int u = H.top().second;
        H.pop();
        V[u] = 1;

        for(auto v : costuri[u]) /// Verificam toti vecinii lui u
        {
            if(dist[v.first] > dist[u] + v.second)
            {
                dist[v.first] = dist[u] + v.second;
                if(V[v.first])
                    continue;
                H.push({-dist[v.first], v.first}); /// Folosim -dist[v.first] ca sa avem in top cea mai mica valoare
            }
        }
    }
}

int main()
{
    int nr_N,nr_M;
    in >> nr_N >> nr_M;

    for(int i = 1; i <= nr_M; i++)
    {
        int x, y, c;
        in >> x >> y >> c;
        costuri[x].push_back({y,c}); /// Muchia de la x plecand in y are costul c
    }

    for(int i = 1; i <= nr_N; i++)
        dist[i] = infinit;

    dijkstra();

    for(int i = 2; i <= nr_N; i++)
    {
        if(dist[i] != infinit)
            out << dist[i] << " ";
        else
            out << "0 ";
    }
    return 0;
}