Advertisement
Guest User

Untitled

a guest
Nov 15th, 2019
109
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.01 KB | None | 0 0
  1. #include <iostream>
  2. #include <fstream>
  3. #include <vector>
  4. #include <limits>
  5. #include <utility>
  6. #include <set>
  7.  
  8. #define IN_FILE_NAME "pathbgep.in"
  9. #define OUT_FILE_NAME "pathbgep.out"
  10.  
  11.  
  12. class Vertex {
  13. public:
  14. unsigned long long way_len;
  15. std::vector< std::pair<int, unsigned int> > child;
  16.  
  17. Vertex() : way_len{ std::numeric_limits<unsigned long long>::max() } {
  18.  
  19. }
  20.  
  21. };
  22.  
  23. long long dijkstraSPF(std::vector<Vertex> &adj_list, int start_v, int finish_v) {
  24. std::set< std::pair<unsigned long long, int> > queue;
  25. adj_list[start_v].way_len = 0;
  26. queue.emplace(0, start_v);
  27.  
  28. while(!queue.empty()) {
  29. auto v_look = *queue.begin();
  30. queue.erase(queue.begin());
  31.  
  32. for (auto &child : adj_list[v_look.second].child) {
  33. int v_to = child.first;
  34. unsigned int e_weight = child.second;
  35. unsigned long long way_len_new = adj_list[v_look.second].way_len + e_weight;
  36.  
  37. if (way_len_new < adj_list[v_to].way_len) {
  38. queue.erase(std::make_pair(adj_list[v_to].way_len, v_to));
  39. adj_list[v_to].way_len = way_len_new;
  40. queue.emplace(adj_list[v_to].way_len, v_to);
  41. }
  42. }
  43.  
  44. }
  45.  
  46. return (adj_list[finish_v].way_len == std::numeric_limits<unsigned long long>::max()) ? -1 : adj_list[finish_v].way_len;
  47. }
  48.  
  49. int main() {
  50. std::ifstream fin(IN_FILE_NAME);
  51.  
  52. int v_count, e_count;
  53. fin >> v_count >> e_count;
  54.  
  55. std::vector<Vertex> adj_list(v_count);
  56. for (int i = 0; i < e_count; ++i) {
  57. int e_begin, e_end, e_weight;
  58. fin >> e_begin >> e_end >> e_weight;
  59. adj_list[e_begin - 1].child.emplace_back(e_end - 1, e_weight);
  60. adj_list[e_end - 1].child.emplace_back(e_begin - 1, e_weight);
  61. }
  62.  
  63. fin.close();
  64.  
  65. dijkstraSPF(adj_list, 0, 0);
  66.  
  67. std::ofstream fout(OUT_FILE_NAME);
  68. for (auto &item : adj_list) {
  69. fout << item.way_len << ' ';
  70. }
  71. fout.close();
  72.  
  73. return 0;
  74. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement