Advertisement
coloriot

HA30_ShortestWay(1)

Nov 8th, 2024
20
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.31 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. #include <queue>
  4.  
  5. using namespace std;
  6.  
  7. class Graph {
  8. private:
  9.     vector<vector<int> > adj;
  10.     vector<bool> used;
  11.     vector<int> prev;
  12.  
  13. public:
  14.     Graph(int vertex_count) {
  15.         adj.resize(vertex_count);
  16.         used.resize(vertex_count, false);
  17.         prev.resize(vertex_count, -1);
  18.     }
  19.  
  20.     void add_edge(int from, int to) {
  21.         adj[from].push_back(to);
  22.         adj[to].push_back(from); // Граф неориентированный
  23.     }
  24.  
  25.     bool BFS(int start_v, int end_v) {
  26.         queue<int> q;
  27.         q.push(start_v);
  28.         used[start_v] = true;
  29.  
  30.         while (!q.empty()) {
  31.             int cur_v = q.front();
  32.             q.pop();
  33.  
  34.             if (cur_v == end_v) {
  35.                 return true;
  36.             }
  37.  
  38.             for (size_t i = 0; i < adj[cur_v].size(); ++i) {
  39.                 int nei = adj[cur_v][i];
  40.                 if (!used[nei]) {
  41.                     q.push(nei);
  42.                     used[nei] = true;
  43.                     prev[nei] = cur_v; // Запоминаем предыдущую вершину
  44.                 }
  45.             }
  46.         }
  47.         return false;
  48.     }
  49.  
  50.     vector<int> get_path(int start_v, int end_v) {
  51.         vector<int> path;
  52.         int v = end_v;
  53.         while (v != -1) {
  54.             path.push_back(v);
  55.             v = prev[v];
  56.         }
  57.         // Разворачиваем путь вручную
  58.         vector<int> reversed_path;
  59.         for (int i = path.size() - 1; i >= 0; --i) {
  60.             reversed_path.push_back(path[i]);
  61.         }
  62.         return reversed_path;
  63.     }
  64. };
  65.  
  66. int main() {
  67.     int n, m;
  68.     cin >> n >> m;
  69.     int a, b;
  70.     cin >> a >> b;
  71.     a--;
  72.     b--;
  73.  
  74.     Graph graph(n);
  75.  
  76.     for (int i = 0; i < m; ++i) {
  77.         int u, v;
  78.         cin >> u >> v;
  79.         u--;
  80.         v--;
  81.         graph.add_edge(u, v);
  82.     }
  83.  
  84.     bool path_exists = graph.BFS(a, b);
  85.  
  86.     if (!path_exists) {
  87.         cout << -1 << endl;
  88.     } else {
  89.         vector<int> path = graph.get_path(a, b);
  90.         cout << path.size() - 1 << endl;
  91.         for (size_t i = 0; i < path.size(); ++i) {
  92.             cout << path[i] + 1;
  93.             if (i + 1 < path.size()) {
  94.                 cout << " ";
  95.             }
  96.         }
  97.         cout << endl;
  98.     }
  99.  
  100.     return 0;
  101. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement