Pagini recente » Cod sursa (job #116999) | Borderou de evaluare (job #2971386) | Borderou de evaluare (job #128213) | Cod sursa (job #1091088) | Cod sursa (job #2173279)
#include <iostream>
#include <fstream>
#include <set>
#include <vector>
#include <climits>
using namespace std;
struct edge { int to, length; };
int dijkstra(const vector< vector<edge> > &graph, int source, int target) {
vector<int> min_distance( graph.size(), INT_MAX );
min_distance[ source ] = 0;
set< pair<int,int> > active_vertices;
active_vertices.insert( {0,source} );
while (!active_vertices.empty()) {
int where = active_vertices.begin()->second;
if (where == target) return min_distance[where];
active_vertices.erase( active_vertices.begin() );
for (auto ed : graph[where])
if (min_distance[ed.to] > min_distance[where] + ed.length) {
active_vertices.erase( { min_distance[ed.to], ed.to } );
min_distance[ed.to] = min_distance[where] + ed.length;
active_vertices.insert( { min_distance[ed.to], ed.to } );
}
}
return INT_MAX;
}
int main() {
std::ifstream in("dijkstra.in");
std::ofstream out("dijkstra.out");
int nodes, edges;
in >> nodes >> edges;
std::vector<std::vector<edge>> graph(nodes, std::vector<edge>());
while (edges--) {
int x, y, w;
in >> x >> y >> w;
graph[x-1].push_back({y-1, w});
}
for (int i = 1; i < nodes; i++) {
out << dijkstra(graph, 0, i) << " ";
}
}