Cod sursa(job #2024902)

Utilizator gabrielinelusGabriel-Robert Inelus gabrielinelus Data 21 septembrie 2017 15:24:46
Problema Algoritmul lui Dijkstra Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.22 kb
#include <bits/stdc++.h>

using namespace std;
#define Nmax 666013
#define INF 0x3f3f3f3f
int DP[Nmax];
vector<vector<pair<int, int> > > G;
priority_queue<pair<int,int> > Q;
int N, M;

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

void dijkstra(int k)
{
    memset(DP,INF,sizeof(DP));
    DP[k] = 0;
    Q.emplace(-0, k);
    while (!Q.empty()) {
        auto crt = Q.top();
        k = crt.second;
        int cost = -crt.first;
        Q.pop();
        if (DP[k] != cost)
            continue;
        for (auto it : G[k]) {
            if(DP[it.second] > DP[k] + it.first) {
                DP[it.second] = DP[k] + it.first;
                Q.emplace(-DP[it.second], it.second);
            }
        }
    }
}

void print()
{
    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);
    print();

    return 0;
}