Advertisement
Neveles

© 2020 Neveles. All rights reserved.

Oct 27th, 2020
1,103
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 0.99 KB | None | 0 0
  1. Graph Graph::getMetagraph()
  2. {
  3.     Graph rGraph(*this);
  4.  
  5.     rGraph.reverse();
  6.  
  7.     rGraph.dfs();
  8.  
  9.     vector<Vertex*> orderedV = rGraph.getVertices();
  10.  
  11.     // Сортируем вершины обратного графа по пост значениям
  12.     getOrderByPost(orderedV);
  13.  
  14.     for (auto& v : orderedV)
  15.     {
  16.         vertices[v->num].visited = false;
  17.     }
  18.  
  19.     int current_scc = -1;
  20.  
  21.     // Расставляем номера вершин метаграфа
  22.     for (auto& v : orderedV)
  23.     {
  24.         if (vertices[v->num].visited == false)
  25.         {
  26.             this->explore(v->num);
  27.  
  28.             ++current_scc;
  29.         }
  30.  
  31.         vertices[v->num].scc = current_scc;
  32.     }
  33.  
  34.     vector<list<int>> metaE(current_scc + 1);
  35.  
  36.     //Составляем массив связей метаграфа
  37.     for (auto& v : this->vertices)
  38.     {
  39.         for (auto& i : edges[v.num])
  40.         {
  41.             if (v.scc != vertices[i].scc)
  42.             {
  43.                 if (find(metaE[v.scc].begin(), metaE[v.scc].end(), vertices[i].scc) == metaE[v.scc].end())
  44.                 {
  45.                     metaE[v.scc].push_back(vertices[i].scc);
  46.                 }
  47.             }
  48.         }
  49.     }
  50.  
  51.     return Graph(metaE);
  52. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement