Advertisement
Galebickosikasa

Untitled

Jun 9th, 2021
45
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.75 KB | None | 0 0
  1. #include "graph.h"
  2. #include "test_runner.h"
  3.  
  4. #include <vector>
  5. #include <string>
  6. #include <algorithm>
  7.  
  8. using namespace std;
  9.  
  10. #ifdef LOCAL
  11. #define dbg(x) cerr << #x << " : " << x << endl
  12. #else
  13. #define dbg(x)
  14. #endif
  15.  
  16. GraphManager::GraphManager(double wait_, double speed_) : wait (wait_), speed (speed_ * 1000 / 60) {}
  17.  
  18. void GraphManager::add_stop(const string &stop) {
  19. stops.push_back (stop);
  20. }
  21.  
  22. void GraphManager::relax_stops() {
  23. sort (stops.begin (), stops.end ());
  24. stops.resize (static_cast<unsigned long>(unique(stops.begin(), stops.end()) - stops.begin()));
  25. // dbg (stops);
  26. g = vector<vector<shared_ptr<edge>>> (stops.size());
  27. }
  28.  
  29. int GraphManager::get_ind(const string &v) {
  30. return static_cast<int> (lower_bound (stops.begin (), stops.end (), v) - stops.begin ());
  31. }
  32.  
  33. int GraphManager::add_edge(const string &from, const string &to, int len, const string& bus) {
  34. int from_ = get_ind (from), to_ = get_ind (to);
  35. shared_ptr<edge> e = make_shared<edge>(edge{to_, -1, static_cast<double>(len) / static_cast<double>(speed), static_cast<int>(edges.size()), bus});
  36. g[from_].push_back (e);
  37. edges.push_back (e);
  38. // cerr << "edge: " << from << ' ' << to << ' ' << len << ' ' << e->edge_num << '\n';
  39. return static_cast<int>(edges.size()) - 1;
  40. }
  41.  
  42. void GraphManager::set_next(int edge_number, int next) {
  43. if (edge_number == -1) return;
  44. edges[edge_number]->next = next;
  45. }
  46.  
  47. struct prev_info {
  48. int edge_num;
  49. int prev_vertex;
  50. double t;
  51. int cur_edge;
  52. };
  53.  
  54. ostream& operator<< (ostream& out, const prev_info& x) {
  55. return out << x.edge_num << ' ' << x.prev_vertex << ' ' << x.t << ' ' << x.cur_edge;
  56. }
  57.  
  58. double GraphManager::Dijkstra(const string &from, const string &to, ostream& out) {
  59. int s = get_ind (from), t = get_ind (to);
  60. // dbg (from);
  61. // dbg (s);
  62. // dbg (stops[s]);
  63. vector<unordered_map<int, double>> d (stops.size ());
  64. vector<unordered_map<int, vector<prev_info>>> prev (stops.size ());
  65. d[s][-1] = 0;
  66. set <pair<double, pair<int, int>>> a; // {distance, {vertex, last edge}}
  67. a.insert ({0, {s, -1}});
  68. while (!a.empty ()) {
  69. auto ptt = a.begin ()->second;
  70. double cur_dist = a.begin ()->first;
  71. a.erase (a.begin ());
  72. int v = ptt.first;
  73. // dbg (v);
  74. // dbg (stops[v]);
  75. // dbg (cur_dist);
  76. // dbg (ptt.second);
  77. if (ptt.second != -1) {
  78. int nxt = edges[ptt.second]->next;
  79. if (nxt != -1) {
  80. shared_ptr<edge> e = edges[nxt];
  81. if (!d[e->to].count (nxt) || d[e->to].at (nxt) > cur_dist + e->len) {
  82. a.erase ({d[e->to][nxt], {e->to, nxt}});
  83. d[e->to][nxt] = cur_dist + e->len;
  84. a.insert ({d[e->to][nxt], {e->to, nxt}});
  85. prev[e->to][nxt].clear ();
  86. prev[e->to][nxt].push_back ({ptt.second, v, e->len, nxt});
  87. }
  88. }
  89. }
  90. for (auto& u: g[v]) {
  91. double new_dist = cur_dist + wait + u->len;
  92. int to_ = u->to;
  93. if (!d[to_].count (u->edge_num) || d[to_].at (u->edge_num) > new_dist) {
  94. a.erase ({d[to_][u->edge_num], {to_, u->edge_num}});
  95. d[to_][u->edge_num] = new_dist;
  96. a.insert ({d[to_][u->edge_num], {to_, u->edge_num}});
  97. prev[to_][u->edge_num].clear ();
  98. prev[to_][u->edge_num].push_back ({ptt.second, v, u->len, u->edge_num});
  99. prev[to_][u->edge_num].push_back ({-1, v, wait, -1});
  100. }
  101. }
  102. }
  103. double mn = 2e9;
  104. int edge_num = -1;
  105. for (auto& x: d[t]) {
  106. if (x.second < mn) {
  107. mn = x.second;
  108. edge_num = x.first;
  109. }
  110. }
  111. // cerr << from << ' ' << to << ' ' << mn << endl;
  112. if (mn == 2e9) {
  113. out << "\"error_message\": \"not found\"\n";
  114. } else {
  115. vector<prev_info> info;
  116. int last = t;
  117. // dbg (s);
  118. while (last != s) {
  119. // dbg (last);
  120. // dbg (edge_num);
  121. auto& v = prev[last][edge_num];
  122. // dbg (v.size ());
  123. for (auto& x: v) {
  124. info.push_back (x);
  125. // dbg (x);
  126. }
  127. edge_num = v.front ().edge_num;
  128. last = v.front ().prev_vertex;
  129. }
  130. reverse (info.begin (), info.end ());
  131. // dbg (info);
  132. out << "\"total_time\": " << mn << ",\n" << "\"items\": [\n";
  133.  
  134. double time = 0;
  135. string bus;
  136. int cnt = 0;
  137. bool is_first = false;
  138. for (const auto& x: info) {
  139. if (x.cur_edge == -1) {
  140. if (time > 0) {
  141. if (is_first) cout << ",\n";
  142. out << "{\n" << "\"type\": \"Bus\",\n" << "\"bus\": " << '"' << bus << '"' << ",\n" <<
  143. "\"span_count\": " << cnt << ",\n" << "\"time\": " << time << "\n}";
  144. }
  145. cnt = 0;
  146. time = 0;
  147. bus = "kek";
  148. if (is_first) cout << ",\n";
  149. is_first = true;
  150. out << "{\n" << "\"type\": \"Wait\",\n" << "\"stop_name\": " << '"' << stops[x.prev_vertex] << '"' << ",\n"
  151. << "\"time\": " << wait << "\n}";
  152. } else {
  153. ++cnt;
  154. bus = edges[x.cur_edge]->bus_num;
  155. time += x.t;
  156. }
  157. }
  158. if (is_first) cout << ",\n";
  159. if (time > 0) out << "{\n" << "\"type\": \"Bus\",\n" << "\"bus\": " << '"' << bus << '"' << ",\n" <<
  160. "\"span_count\": " << cnt << ",\n" << "\"time\": " << time << "\n}]\n";
  161. else out << "]\n";
  162. }
  163. // cerr << "DONE\n";
  164. return mn;
  165. }
  166.  
  167.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement