Pagini recente » Cod sursa (job #1420739) | Cod sursa (job #863280) | Cod sursa (job #2170653) | Cod sursa (job #2947727) | Cod sursa (job #2483526)
#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;
}