Cod sursa(job #3030676)

Utilizator mihai_popaPopa Mihai-Razvan mihai_popa Data 17 martie 2023 20:05:08
Problema Algoritmul lui Dijkstra Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.49 kb
#include <bits/stdc++.h>


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

using PII = pair < int, int >;

const int NMAX = 1e5 + 3;
const long long INF = 5e9 + 3;

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

long long d[NMAX];
bool sel[NMAX];
priority_queue < PII, vector < PII >, greater < PII > > H;

void Read()
{
    fin >> N >> M;
    for(int i = 1; i <= M; ++i) {
        int u, v, cost;
        fin >> u >> v >> cost;

        G[u].push_back({cost, v});
        ///G[v].push_back({cost, u});
    }
}

void Dijkstra(int root)
{
    for(int i = 1; i <= N; ++i)
        d[i] = INF;

    d[root] = 0;
    sel[root] = true;

    for(auto it: G[root]) {
        H.push(it);
        d[it.second] = it.first;
    }

    for(int i = 1; i <= N; ++i) {
        while(!H.empty() && sel[H.top().second])
            H.pop();
        if(H.empty())
            break;

        PII h = H.top();
        int nod = h.second;
        int dist = h.first;
        sel[nod] = true;

        for(auto it: G[nod]) {
            if(!sel[it.second] && d[it.second] > dist + it.first) {
                H.push({dist + it.first, it.second});
                d[it.second] = dist + it.first;
            }
        }
    }
}

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

    for(int i = 2; i <= N; ++i) {
        if(d[i] == INF) {
            fout << "0 ";
            continue;
        }
        fout << d[i] << ' ';
    }
    return 0;
}