smatskevich

Seminar7

Mar 24th, 2022 (edited)
284
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.43 KB | None | 0 0
  1. // Здесь только main.cpp.
  2. // ListGraph.hpp - как в предыдущем семинаре.
  3.  
  4. #include <algorithm>
  5. #include <iostream>
  6. #include <queue>
  7. #include <vector>
  8.  
  9. #include "ListGraph.hpp"
  10.  
  11. void BFS(const IGraph& g) {
  12.   std::vector<bool> visited(g.VerticesCount());
  13.  
  14.   for (int i = 0; i < g.VerticesCount(); ++i) {
  15.     if (!visited[i]) {
  16.       std::queue<int> q;
  17.       q.push(i);
  18.       visited[i] = true;
  19.       while (!q.empty()) {
  20.         int current = q.front();
  21.         q.pop();
  22.         std::cout << current << " ";
  23.         for (int w: g.FindAllAdjacentOut(current)) {
  24.           if (!visited[w]) {
  25.             q.push(w);
  26.             visited[w] = true;
  27.           }
  28.         }
  29.       }
  30.     }
  31.   }
  32.   std::cout << std::endl;
  33. }
  34.  
  35. int main1() {
  36.   ListGraph lg(10);
  37.   lg.AddEdge(6, 0);
  38.   lg.AddEdge(3, 4);
  39.   lg.AddEdge(4, 8);
  40.   lg.AddEdge(7, 8);
  41.   lg.AddEdge(3, 2);
  42.   lg.AddEdge(2, 1);
  43.   lg.AddEdge(2, 5);
  44.   lg.AddEdge(1, 5);
  45.   lg.AddEdge(5, 7);
  46.   lg.AddEdge(9, 1);
  47.   lg.AddEdge(9, 3);
  48.  
  49.   BFS(lg);
  50.  
  51.   std::cout << "Hello, World!" << std::endl;
  52.   return 0;
  53. }
  54.  
  55. void ReverseDFS(const IGraph& g, int v, std::vector<int>& leaves, std::vector<bool>& visited) {
  56.   static int time = 0;
  57.   visited[v] = true;
  58.   for (int u : g.FindAllAdjacentIn(v)) {
  59.     if (!visited[u])
  60.       ReverseDFS(g, u, leaves, visited);
  61.   }
  62.   leaves[v] = ++time;
  63. }
  64.  
  65. std::vector<int> MainReverseDFS(const IGraph& g) {
  66.   std::vector<int> leaves(g.VerticesCount());
  67.   std::vector<bool> visited(g.VerticesCount());
  68.   for (int v = 0; v < g.VerticesCount(); ++v) {
  69.     if (!visited[v]) {
  70.       ReverseDFS(g, v, leaves, visited);
  71.     }
  72.   }
  73.   return leaves;
  74. }
  75.  
  76. void DFS(const IGraph& g, int v, std::vector<bool>& visited, std::vector<int>& components, int component) {
  77.   visited[v] = true;
  78.   components[v] = component;
  79.   for (int u : g.FindAllAdjacentOut(v)) {
  80.     if (!visited[u])
  81.       DFS(g, u, visited, components, component);
  82.   }
  83. }
  84.  
  85. std::vector<int> MainDFS(const IGraph& g, const std::vector<int>& leaves) {
  86.   std::vector<std::pair<int, int>> leave_and_vertices;
  87.   for (int i = 0; i < leaves.size(); ++i) leave_and_vertices.push_back({leaves[i], i});
  88.   std::sort(leave_and_vertices.rbegin(), leave_and_vertices.rend());
  89.  
  90.   std::vector<int> components(g.VerticesCount());
  91.   std::vector<bool> visited(g.VerticesCount());
  92.  
  93.   int component = 0;
  94.   for (auto& [leave, v] : leave_and_vertices) {
  95.     if (!visited[v]) {
  96.       DFS(g, v, visited, components, component);
  97.     }
  98.     ++component;
  99.   }
  100.   return components;
  101. }
  102.  
  103. ListGraph Condensation(const IGraph& g) {
  104.   // Соберем соответствие номер вершины -> номер КСС.
  105.   // Алгоритм Косарайю.
  106.   // Собираем времена выхода.
  107.   std::vector<int> leaves = MainReverseDFS(g);
  108.   // Запускаем DFS в порядке убывания leaves.
  109.   std::vector<int> components = MainDFS(g, leaves);
  110.  
  111.   // Создадим граф конденсации и заполним его.
  112.   ListGraph condensation();
  113.   return condensation;
  114. }
  115.  
  116. int main() {
  117.   ListGraph lg(10);
  118.   lg.AddEdge(6, 0);
  119.   lg.AddEdge(3, 4);
  120.   lg.AddEdge(4, 8);
  121.   lg.AddEdge(7, 8);
  122.   lg.AddEdge(3, 2);
  123.   lg.AddEdge(2, 1);
  124.   lg.AddEdge(2, 5);
  125.   lg.AddEdge(1, 5);
  126.   lg.AddEdge(5, 7);
  127.   lg.AddEdge(9, 1);
  128.   lg.AddEdge(9, 3);
  129.  
  130.   ListGraph condensation = Condensation(lg);
  131.  
  132.   std::cout << "Hello, World!" << std::endl;
  133.   return 0;
  134. }
  135.  
Add Comment
Please, Sign In to add comment