Advertisement
maxim_shlyahtin

A_1

May 20th, 2024
417
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.36 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. #include <map>
  4. #include <utility>
  5. #include <string>
  6. #include <limits>
  7. #include <sstream>
  8.  
  9. template<typename T>
  10. std::vector<T> greedy_alg(std::map<T, std::vector<std::pair<T, double>>>& graph, T start, T end) {
  11.     std::vector<T> path = { start };
  12.     std::map<T, std::pair<bool, int>> vertices; // словарь, хранящий информацию о том, посещалась ли это вершина и в какое количество вершин из нее можно перейти
  13.     double inf = std::numeric_limits<double>::max();
  14.     double minWeight = inf;
  15.     int current = start;
  16.     vertices[start] = { true, graph[current].size() };
  17.     while (current != end) {
  18.         auto& vertex = vertices[current];
  19.         if (!vertex.first) { // проверяем посещали ли до этого текущую вершину
  20.             vertex.second = graph[current].size();
  21.             vertex.first = true;
  22.         }
  23.         if (vertex.second == 0) { // если у вершины нет соседей из которых можно попасть в конец, возвращаемся к предыдущей вершине
  24.             path.pop_back();
  25.             if (!path.empty()) {
  26.                 current = path.back();
  27.             }
  28.             continue;
  29.         }
  30.         int tmp;
  31.         char next;
  32.         std::string str = "Possible paths:";
  33.         std::string d = "Deadends:";
  34.         std::stringstream out;
  35.         std::stringstream ssd;
  36.         std::cout << "Current vertice: " << current << '\n';
  37.         for (const auto& vert : graph[current]) {
  38.             tmp = !vertices[vert.first].first ? graph[vert.first].size() : vertices[vert.first].second; // количество соседей из которых потенциально можно дойти до конца
  39.             if (vert.second < minWeight && tmp > 0) { // отбираем нужную вершину
  40.                 minWeight = vert.second;
  41.                 next = vert.first;
  42.             }
  43.             if (vert.second < minWeight && tmp == 0 && vert.first != end) { // сосед оказался тупиком
  44.                 vertex.second--;
  45.                 ssd << ' ' << vert.first;
  46.                 continue;
  47.             }
  48.             if (vert.second < minWeight && vert.first == end) { // дошли до конца
  49.                 path.push_back(end);
  50.                 return path;
  51.             }
  52.             out << " | " << current << "-" << vert.first << ": " << vert.second << "(weight) | ";
  53.         }
  54.         str = (str + out.str()).length() > str.length() ? str + out.str() : str + " None";
  55.         std::cout << str << '\n';
  56.         d = (d + ssd.str()).length() > d.length() ? d + ssd.str() + '\n' : "";
  57.         std::cout << d;
  58.         path.push_back(next);
  59.         minWeight = inf;
  60.         current = next;
  61.     }
  62.     return path;
  63. }
  64.  
  65. int main() {
  66.     std::map<int, std::vector<std::pair<int, double>>> graph;
  67.     int start, end;
  68.     std::cin >> start >> end;
  69.     char from, to;
  70.     double weight;
  71.  
  72.     while (std::cin >> from >> to >> weight) {
  73.         graph[from].emplace_back(to, weight);
  74.     }
  75.     std::vector<int> res = greedy_alg(graph, start, end);
  76.     std::cout << "Path: ";
  77.     for (const auto& it : res) {
  78.         std::cout << it;
  79.     }
  80.     std::cout << '\n';
  81.     return 0;
  82. }
  83.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement