Cod sursa(job #2846069)

Utilizator lucamLuca Mazilescu lucam Data 8 februarie 2022 18:45:58
Problema Algoritmul lui Dijkstra Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.19 kb
#include <bits/stdc++.h>

std::ifstream in("dijkstra.in");
std::ofstream out("dijkstra.out");

const int N = 5e4 + 1;

struct EdgeTo {
    int v, c;
};
int n, m;
std::vector<EdgeTo> g[N];
int d[N];
bool vis[N];
struct QueuedNode {
    int u, d;
    bool operator<(const QueuedNode rhs) const {
        return d > rhs.d;
    }
};
std::priority_queue<QueuedNode> q;

void dijkstra(int u0) {
    std::fill(d + 1, d + n + 1, std::numeric_limits<int>::max());
    q.push({u0, 0});
    d[u0] = 0;
    while (!q.empty()) {
        int u = q.top().u;
        q.pop();
        if (vis[u]) {
            continue;
        }
        vis[u] = true;
        for (auto e : g[u]) {
            if (d[u] + e.c < d[e.v]) {
                d[e.v] = d[u] + e.c;
                q.push({e.v, d[e.v]});
            }
        }
    }
}

int main() {
    in >> n >> m;
    for (int i = 0; i < m; ++i) {
        int u, v, c;
        in >> u >> v >> c;
        g[u].push_back({v, c});
    }
    dijkstra(1);
    for (int i = 2; i <= n; ++i) {
        if (d[i] == std::numeric_limits<int>::max()) {
            d[i] = 0;
        }
        out << d[i] << ' ';
    }
    out << '\n';
}