Nu aveti permisiuni pentru a descarca fisierul grader_test6.ok
Cod sursa(job #2680168)
Utilizator | Data | 2 decembrie 2020 20:33:47 | |
---|---|---|---|
Problema | Algoritmul lui Dijkstra | Scor | 0 |
Compilator | cpp-64 | Status | done |
Runda | Arhiva educationala | Marime | 1.36 kb |
#include <iostream>
#include <vector>
#include <algorithm>
#include <set>
#include <fstream>
using namespace std;
typedef std::pair<int, int> edge;
std::vector<int> shortest_path(const std::vector<std::vector<edge> >& graph, const int source){
int N = graph.size();
std::set<std::pair<int,int> > S;
std::vector<int> dist;
for(int i = 0; i <= N; i++){
dist.push_back(INT_MAX);
}
dist[source] = 0;
S.insert({0, source});
while(!S.empty()){
int x = S.begin()->second;
S.erase(S.begin());
for(edge e : graph[x]){
int y = e.first;
int c = e.second;
if(dist[y] > dist[x] + c){
if(dist[y] != INT_MAX){
S.erase(S.find({y, dist[y]}));
}
dist[y] = dist[x] + c;
S.insert({dist[y], y});
}
}
}
return dist;
}
int main(){
std::ifstream cin("dijkstra.in");
std::ofstream cout("dijkstra.out");
int N, M;
cin >> N >> M;
std::vector<std::vector<edge> > graph;
for(int i = 0; i<=N; i++){
std::vector<edge> v;
graph.push_back(v);
}
for(int i = 0,x,y,z; i < M; i++){
cin >> x >> y >> z;
graph[x].push_back({y,z});
}
std::vector<int> dist = shortest_path(graph, 1);
for(int i = 1; i<=N;i++){
cout << (dist[i] == INT_MAX ? 0 : dist[i]) << ' ';
}
}