Cod sursa(job #3140335)

Utilizator andreiomd1Onut Andrei andreiomd1 Data 5 iulie 2023 16:07:14
Problema Algoritmul lui Dijkstra Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.48 kb
#include <fstream>
#include <vector>
#include <queue>

using namespace std;

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

using PII = pair<int, int>;

static constexpr int NMAX = (int)(5e4 + 1);
static const int INF = (int)1e9;

int n;
vector<PII> G[NMAX];

int d[NMAX];
bool Sel[NMAX];

auto cmp = [](PII A, PII B)
{
    if (!(A.first < B.first))
        return 1;
    return 0;
};
priority_queue<PII, vector<PII>, decltype(cmp)> H(cmp);

static inline void Load()
{
    f.tie(nullptr);

    f >> n;

    int m = 0;
    f >> m;
    for (int e = 1; e <= m; ++e)
    {
        int x = 0, y = 0, c = 0;
        f >> x >> y >> c;

        G[x].push_back({c, y});
    }

    return;
}

int main()
{
    Load();

    for (int i = 1; i <= n; ++i)
        d[i] = INF, Sel[i] = 0;

    d[1] = 0, Sel[1] = 1;
    for (auto it : G[1])
        if (it.first < d[it.second])
            d[it.second] = it.first, H.push(it);

    while (!H.empty())
    {
        while (!H.empty() && Sel[H.top().second])
            H.pop();

        if (H.empty())
            break;

        int node = H.top().second;
        int cost = H.top().first;

        Sel[node] = 1, H.pop();

        for (auto it : G[node])
            if (cost + it.first < d[it.second])
                d[it.second] = cost + it.first, H.push({d[it.second], it.second});
    }

    for (int i = 2; i <= n; ++i)
    {
        g << (d[i] == INF ? 0 : d[i]);

        if (i < n)
            g << ' ';
        else
            g << '\n';
    }

    return 0;
}