Pagini recente » Cod sursa (job #2198799) | Cod sursa (job #998990) | Cod sursa (job #2797310) | Cod sursa (job #602490) | Cod sursa (job #2199646)
#include <algorithm>
#include <fstream>
#include <limits>
#include <utility>
#include <vector>
#define INF std::numeric_limits<unsigned>::max()
#define COMP std::greater<std::pair<unsigned, unsigned>>()
int main() {
std::ifstream in("dijkstra.in");
std::ofstream out("dijkstra.out");
unsigned n, m;
in >> n >> m;
std::vector<std::vector<std::pair<unsigned, unsigned>>> graph;
graph.reserve(n);
for (unsigned i = 0; i < n; i++) graph.push_back(std::vector<std::pair<unsigned, unsigned>>());
for (unsigned i = 0; i < m; i++) {
unsigned from, to, cost;
in >> from >> to >> cost;
graph[from - 1].push_back(std::make_pair(cost, to));
}
std::vector<bool> visited;
visited.reserve(n);
for (unsigned i = 0; i < n; i++) visited.push_back(false);
std::vector<std::pair<unsigned, unsigned>> costs;
costs.push_back(std::make_pair(0, 1));
for (unsigned i = 1; i < n; i++) costs.push_back(std::make_pair(INF, i + 1));
std::vector<unsigned> finalCosts;
finalCosts.reserve(n);
finalCosts.push_back(0);
for (unsigned i = 1; i < n; i++) finalCosts.push_back(INF);
while (costs.size() != 0) {
unsigned currentNode = costs.begin()->second;
unsigned currentCost = finalCosts[currentNode - 1];
visited[currentNode - 1] = true;
for (auto v : graph[currentNode - 1]) {
unsigned cost = v.first;
unsigned node = v.second;
finalCosts[node - 1] = std::min(finalCosts[node - 1], currentCost + cost);
}
std::pop_heap(costs.begin(), costs.end(), COMP);
costs.pop_back();
}
for (unsigned i = 1; i < n; i++) {
if (finalCosts[i] == INF) finalCosts[i] = 0;
out << finalCosts[i] << " ";
}
return 0;
}