Cod sursa(job #2807414)

Utilizator andreiomd1Onut Andrei andreiomd1 Data 23 noiembrie 2021 19:16:39
Problema Algoritmul lui Dijkstra Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.76 kb
#include <fstream>
#include <vector>
#include <queue>

using namespace std;

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

typedef pair < int, int > PII;

const int NMAX = 5e4 + 1, ROOT = 1;
const int INF = 1e9;

int N, M;
vector < PII > G[NMAX];

bool Sel[NMAX];
int d[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  Read ()
{
    f.tie(nullptr);

    f >> N >> M;

    for(int i = 1; i <= M; ++i)
    {
        int a = 0, b = 0, c = 0;
        f >> a >> b >> c;

        G[a].push_back({c, b});
    }

    return;
}

static inline void Initialize ()
{
    for(int i = 1; i <= N; ++i)
        Sel[i] = false, d[i] = INF;

    return;
}

static inline void Dijkstra (int S)
{
    Initialize();

    Sel[1] = true;
    d[1] = 0;

    for(auto it : G[S])
        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;

        PII Top = H.top();
        int Node = Top.second, Cost = 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});
    }

    return;
}

static inline void Write ()
{
    for(int i = 2; i <= N; ++i)
    {
        g << ((d[i] != INF) ? d[i] : 0);

        if(i != N)
            g << ' ';
    }

    g << '\n';

    return;
}

int main()
{
    Read();

    Dijkstra(ROOT);

    Write();

    return 0;
}