Cod sursa(job #2307394)

Utilizator gabrielinelusGabriel-Robert Inelus gabrielinelus Data 24 decembrie 2018 15:00:14
Problema Algoritmul lui Dijkstra Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.18 kb
#include <bits/stdc++.h>

#define INF 0x3f3f3f3f

using namespace std;
int N, M;
vector<vector<pair<int, int> > > G;
vector<int> DP;
priority_queue<pair<int,int> > Pq;

void read()
{
    scanf("%d%d", &N, &M);
    G.resize(N + 1);
    DP.resize(N + 1);
    for (int i = 1; i <= M; ++i) {
        int a,b,c;
        scanf("%d%d%d", &a, &b, &c);
        G[a].emplace_back(c, b);
    }
}

void dijkstra(int k)
{
    fill(DP.begin(), DP.end(), INF);
    DP[k] = 0;
    Pq.push({0, k});

    while (!Pq.empty()) {
        auto top = Pq.top(); Pq.pop();
        int cost = -top.first;
        k = top.second;

        if (cost != DP[k])
            continue;

        for (auto it : G[k]) {
            int v = it.second;
            int edge_cost = it.first;
            if (DP[v] > DP[k] + edge_cost) {
                DP[v] = DP[k] + edge_cost;
                Pq.push({-DP[v], v});
            }
        }
    }
    for (int i = 2; i <= N; ++i)
        if (DP[i] < INF)
            printf("%d ", DP[i]);
        else
            printf("0 ");
    printf("\n");
}

int main()
{
    freopen("dijkstra.in", "r", stdin);
    freopen("dijkstra.out", "w", stdout);

    read();
    dijkstra(1);

    return 0;
}