Cod sursa(job #2483526)

Utilizator SqueekDanielTodasca Daniel SqueekDaniel Data 29 octombrie 2019 21:04:09
Problema Algoritmul lui Dijkstra Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.63 kb
#include <bits/stdc++.h>

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

#define num     int
#define num_mat std::vector <std::vector <std::pair <int, num>>>
#define num_INF 2000000005

class DijkstraSolver {
public:
    DijkstraSolver(num_mat& graph, int start = 0) {
        dist.resize(graph.size(), num_INF);
        routine(graph, start);
    }

    num operator[] (int idx) const { return dist[idx]; }
    std::vector <num> getDist() const { return dist; }

protected:
    std::vector <num> dist;

private:
    void routine(num_mat& graph, int start) {
        dist[start] = 0;
        std::priority_queue <std::pair <num, int>, std::vector <std::pair<num, int>>, std::greater <std::pair <num, int>>> queue;
        queue.push({0, start});

        while (!queue.empty()) {
            auto front = queue.top();
            queue.pop();
            if (front.first > dist[front.second]) continue;
            for (auto &it:graph[front.second])
                if (dist[it.first] > dist[front.second] + it.second) {
                    dist[it.first] = dist[front.second] + it.second;
                    queue.push({dist[it.first], it.first});
                }
        }
    }
};

int N, M;
num_mat graph;
inline void addEdge(int x, int y, num w) {
    graph[x].push_back({y, w});
}

int main()
{
    input >> N >> M;
    graph.resize(N);
    for (int i=0, x, y, w; i<M; ++i)
        input >> x >> y >> w, addEdge(--x, --y, w);

    DijkstraSolver solver(graph);
    for (int i=1; i<N; ++i)
        output << (solver[i] < num_INF ? solver[i] : 0) << ' ';

    return 0;
}