Cod sursa(job #2461770)

Utilizator MarianConstantinMarian Constantin MarianConstantin Data 26 septembrie 2019 09:41:52
Problema Algoritmul lui Dijkstra Scor 20
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.42 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
#define pb push_back

using namespace std;

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

struct Elem {
    int node, cost;
};

class Comparator {
public:
    bool operator() (const Elem &a, const Elem &b) {
        if (a.cost != b.cost)
            return a.cost > b.cost;
        return a.node > b.node;
    }
};

const int MAXN = 5 * 1e4 + 10, INF = 0x3f3f3f3f;
int distances[MAXN], n, m;
vector<Elem> edges[MAXN];
priority_queue<Elem, vector<Elem>, Comparator> heap;

void read() {
    int x, y, cost;
    fin >> n >> m;
    for (int i = 0; i < m; ++i) {
        fin >> x >> y >> cost;
        edges[x].pb({y, cost});
    }
}

void initialize() {
    for (int i = 1; i <= n; ++i)
        distances[i] = INF;
}

void solve() {
    heap.push({1, 0});
    distances[1] = 0;
    while (!heap.empty()) {
        Elem el = heap.top();
        heap.pop();
        for (auto &it: edges[el.node]) {
            if (distances[el.node] + it.cost < distances[it.node]) {
                distances[it.node] = distances[el.node] + it.cost;
                heap.push({it.node, distances[it.node]});
            }
        }
    }
}

void print() {
    for (int i = 2; i <= n; ++i)
        fout << distances[i] << ' ';
}

int main() {
    read();
    initialize();
    solve();
    print();
    return 0;
}