Advertisement
SkeptaProgrammer

Untitled

Dec 9th, 2019
174
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.20 KB | None | 0 0
  1. // task5.cpp : Этот файл содержит функцию "main". Здесь начинается и заканчивается выполнение программы.
  2. //
  3.  
  4. /*
  5. Задача 8.
  6.  
  7. в городе расположена n автобусных остановок, обозначенных числами и
  8. N 1.2 n; Имеется К автобусных маршрутов, заданных последовательностями
  9. соседних остановок при движении автобуса в одном направлении:
  10.  
  11. M ={1).j2... 11).
  12. M,={ 122 12м3},
  13.  
  14. где І, натуральное
  15.  
  16. Написать программу. которая по заданным номерам остановок I и определяет
  17. наиболее быстрый путь перемещения пассажира с остановки I и остановку J с
  18. использованием имеющихся маршрутов автобусов при условии, что время
  19. движения между соседними остановками у всех маршрутов одинаково. Кроме того, автобусы могут двигаться в
  20. обоих направлениях
  21.  
  22. */
  23. #include "pch.h"
  24. #include <iostream>
  25. #include <list>
  26. #include <vector>
  27. #include <set>
  28. #include <algorithm>
  29. #include <iterator>
  30. using namespace std;
  31.  
  32. vector<vector<pair<int,vector<int> > > > graph;
  33. set<vector<int> > routs; // все найденные пути между заданной парой вершин
  34. vector<int> path; // найденный путь
  35.  
  36. // поиск в глубину
  37. void dfs(int const& nodeCur, int const& nodeLast)
  38. {
  39. if (find(path.begin(), path.end(), nodeCur) == path.end())
  40. {
  41. path.emplace_back(nodeCur);
  42.  
  43. if (nodeCur == nodeLast)
  44. {
  45. for (auto const& val : path)
  46. {
  47. cout << val << " ";
  48. }
  49. cout << endl;
  50. routs.emplace(path);
  51. path.pop_back();
  52. return;
  53. }
  54.  
  55. for (auto const& val : graph.at(nodeCur - 1))
  56. {
  57. dfs(val.first, nodeLast);
  58. }
  59. path.pop_back();
  60. }
  61. }
  62.  
  63. int main()
  64. {
  65. // автобусные маршруты
  66. vector<vector<int> > busRoutes = { { 4, 3, 2, 1 }, // bus # 0
  67. { 1, 5, 3, 4 }, // bus # 1
  68. { 4, 2, 1 } }; // bus # 2
  69. // заданные номера остановок
  70. pair<int, int> endPoints(1, 4);
  71.  
  72. // заполнение графа как списка смежности
  73. int vert = 0;
  74. do
  75. {
  76. ++vert;
  77. for (int r = 0; r < busRoutes.size(); ++r)
  78. {
  79. for (int c = 0; c < busRoutes.at(r).size(); ++c)
  80. {
  81.  
  82. if (busRoutes.at(r).at(c) == vert)
  83. {
  84. if (graph.size() < vert)
  85. {
  86. graph.push_back(vector<pair<int, vector<int>>>());
  87. }
  88.  
  89. if (c > 0)
  90. {
  91. auto itLeftNeighbour = find_if(graph.at(vert - 1).begin(), graph.at(vert - 1).end(), [&](auto const& par) {return par.first == busRoutes.at(r).at(c - 1); });
  92. if (itLeftNeighbour != graph.at(vert - 1).end())
  93. {
  94. itLeftNeighbour->second.push_back(r);
  95. }
  96. else
  97. {
  98. vector<int> v = { r };
  99. graph.at(vert - 1).emplace_back(busRoutes.at(r).at(c - 1), v);
  100. }
  101. }
  102. if (c < busRoutes.at(r).size() - 1)
  103. {
  104. auto itRightNeighbour = find_if(graph.at(vert - 1).begin(), graph.at(vert - 1).end(), [&](auto const& par) {return par.first == busRoutes.at(r).at(c + 1); });
  105. if (itRightNeighbour != graph.at(vert - 1).end())
  106. {
  107. itRightNeighbour->second.push_back(r);
  108. }
  109. else
  110. {
  111. vector<int> v = { r };
  112. graph.at(vert - 1).emplace_back(busRoutes.at(r).at(c + 1), v);
  113. }
  114. }
  115. }
  116.  
  117. }
  118. }
  119. } while (graph.size() == vert);
  120.  
  121. // поиск всех путей между парой вершин
  122. dfs(endPoints.first, endPoints.second);
  123.  
  124. /*// вывод найденных путей
  125. for (auto const& path : routs)
  126. {
  127. for (auto const& node : path)
  128. {
  129. cout << node << " ";
  130. }
  131. cout << endl;
  132. } //*/
  133.  
  134.  
  135.  
  136. // для каждого найденного пути -> каждой вершины находим vector исходящих автобусов
  137. vector<vector<vector<int>>> numbers(routs.size());
  138. int j = -1;
  139. for (auto const& path : routs)
  140. {
  141. ++j;
  142. for (int i = 0; i < path.size() - 1; ++i)
  143. {
  144. auto it = find_if(graph[path[i] - 1].begin(), graph[path[i] - 1].end(), [&](auto const& pr) {return pr.first == path[i + 1]; });
  145. if (it != graph[path[i] - 1].end())
  146. {
  147. numbers[j].push_back(it->second);
  148. }
  149. }
  150. }
  151.  
  152. // находим длиннейшие цепи автобусов
  153. vector<vector<pair<int, int>>> maxNumLen;
  154. for (int j = 0; j < numbers.size(); ++j)
  155. {
  156. for (int i = 0; i < numbers[j].size(); )
  157. {
  158. int maxLen = 1;
  159. vector<pair<int, int>> numLen;
  160. for (auto const& number : numbers[j][i])
  161. {
  162. int len = 0;
  163. for (int k = i; k < numbers[j].size(); ++k)
  164. {
  165. auto it = find(numbers[j][k].begin(), numbers[j][k].end(), number);
  166. if (it != numbers[j][k].end())
  167. {
  168. ++len;
  169. }
  170. else break;
  171.  
  172. }
  173. numLen.emplace_back(number, len);
  174. }
  175. auto it = max_element(numLen.begin(), numLen.end(), [](auto const& pr1, auto const& pr2) {return pr1.second < pr2.second; });
  176. maxLen = it->second;
  177. for (auto const& pr : numLen)
  178. {
  179. if (pr.second == maxLen)
  180. {
  181. if (maxNumLen.size() < j + 1)
  182. {
  183. vector<pair<int, int>> v;
  184. maxNumLen.push_back(v);
  185. }
  186. maxNumLen[j].push_back(pr);
  187. break;
  188. }
  189. }
  190. i += maxLen;
  191. }
  192. }
  193.  
  194.  
  195.  
  196.  
  197. // веса путей
  198. vector<int> weights;
  199. for (int i = 0; i < maxNumLen.size(); ++i)
  200. {
  201. int ribs = 0;
  202. //int transfers = maxNumLen[i].size() - 1;
  203. for (int j = 0; j < maxNumLen[i].size(); ++j)
  204. {
  205. ribs += maxNumLen[i][j].second;
  206. }
  207. weights.emplace_back(ribs);
  208. cout << "rout # " << i << " weight: " << ribs << endl;
  209. }
  210.  
  211. auto it = min_element(weights.begin(), weights.end());
  212. int ind = it - weights.begin();
  213. cout << "\nAnswer: \n";
  214. for (auto const& pr : maxNumLen[ind])
  215. {
  216. cout << "bus number: " << pr.first << " ribs count: " << pr.second << endl;
  217. }
  218. cout << endl;
  219. return 0;
  220. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement