Cod sursa(job #3364855)

Utilizator TimofeiFilipTimofei Filip Emanuel TimofeiFilip Data 12 septembrie 2026 15:10:05
Problema Algoritmul lui Dijkstra Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.31 kb
#include<bits/stdc++.h>
using namespace std;
const int NMAX = 5e5 + 10;

vector<pair<int, int> > adj[NMAX];

priority_queue<pair<int, int>, vector<pair<int, int>>, greater<pair<int, int> > > hp;
int result[NMAX];

void expand(int current_node) {
    for (auto [vecin, cost] : adj[current_node]) {
        //printf("%d %d %d %d %d\n",current_node, result[current_node], vecin, result[vecin], cost);
        if (cost + result[current_node] < result[vecin]) {
            result[vecin] = cost + result[current_node];
            hp.push({result[vecin], vecin});
        }
    }
}

void dijkstra(int starting_node, int n) {
    for (int i = 1; i <= n; i++) result[i] = INT_MAX;
    result[starting_node] = 0;
    hp.push({0, starting_node});

    while (!hp.empty()) {
        pair<int, int> current_pair = hp.top();
        hp.pop();
        if (result[current_pair.second] != current_pair.first) continue;
        expand(current_pair.second);
    }
}

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

    int n, m; scanf("%d %d", &n, &m);

    for (; m > 0; m--) {
        int x, y, cost; scanf("%d %d %d", &x, &y, &cost);
        adj[x].push_back({y, cost});
    }
    dijkstra(1, n);
    for (int i = 2; i <= n; i++)
        printf("%d ", result[i] == INT_MAX ? 0 : result[i]);


    return 0;
}