olexander_dan

Untitled

Aug 2nd, 2019
275
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.94 KB | None | 0 0
  1. // Find max distance for each vertex in graph
  2. #include <iostream>
  3. #include <vector>
  4. #include <queue>
  5.  
  6. size_t* maxDist(bool** m, const size_t& size);
  7. size_t maxDistUtil(bool** m, const size_t& v, const size_t& size);
  8. std::vector<size_t> adjVertices(bool** m, const size_t& v, const size_t& size, bool* visited);
  9.  
  10.  
  11. int main() {
  12.     // ADJACENCY MATRIX EMULATION
  13.     constexpr size_t n = 6;
  14.     bool** matrix = new bool* [n]{};
  15.     for (size_t i = 0; i < n; ++i)
  16.         matrix[i] = new bool[n]{};
  17.  
  18.     matrix[0][1] = matrix[1][0] = true;
  19.     matrix[0][2] = matrix[2][0] = true;
  20.     matrix[1][3] = matrix[3][1] = true;
  21.     matrix[1][4] = matrix[4][1] = true;
  22.     matrix[4][5] = matrix[5][4] = true;
  23.  
  24.     //0 1 1 0 0 0
  25.     //1 0 0 1 1 0
  26.     //1 0 0 0 0 0
  27.     //0 1 0 0 0 0
  28.     //0 1 0 0 0 1
  29.     //0 0 0 0 1 0
  30.     /////////////////////////////////
  31.  
  32.  
  33.     //matrix[0][1] = matrix[1][0] = true;
  34.     //matrix[0][2] = matrix[2][0] = true;
  35.     //matrix[1][2] = matrix[2][1] = true;
  36.     //matrix[2][4] = matrix[4][2] = true;
  37.     //matrix[3][4] = matrix[4][3] = true;
  38.     //// 0 1 1 0 0
  39.     //// 1 0 1 0 0
  40.     //// 1 1 0 0 1
  41.     //// 0 0 0 0 1
  42.     //// 0 0 1 1 0
  43.     /////////////////////////////////
  44.    
  45.     size_t* resultM = maxDist(matrix, n);
  46.     for (size_t i = 0; i < n; ++i)
  47.         std::cout << i << ": " << resultM[i] << std::endl;
  48.    
  49.     system("pause");
  50.     return 0;
  51. }
  52.  
  53. size_t* maxDist(bool** m, const size_t& size) {
  54.     size_t* resDist = new size_t[size];
  55.     for (size_t i = 0; i < size; ++i) {
  56.         resDist[i] = maxDistUtil(m, i, size);
  57.     }
  58.     return resDist;
  59. }
  60.  
  61. //size_t maxDistUtil(bool** m, const size_t& v, const size_t& size) {
  62. //  bool* visited = new bool[size] {};
  63. //  visited[v] = true;
  64. //
  65. //  size_t dist = 0;
  66. //  std::queue<size_t> stack;
  67. //  for (auto&& i : adjVertices(m, v, size))
  68. //      stack.push(i);
  69. //
  70. //  while (!stack.empty()) {
  71. //      size_t& p = stack.front();
  72. //      stack.pop();
  73. //     
  74. //      for (auto&& i : adjVertices(m, p, size)) {
  75. //          if (!visited[i]) {
  76. //              visited[i] = true;
  77. //              stack.push(i);
  78. //              ++dist;
  79. //          }
  80. //      }
  81. //      visited[p] = true;
  82. //  }
  83. //  delete[]visited;
  84. //  return dist;
  85. //}
  86.  
  87. size_t maxDistUtil(bool** m, const size_t& v, const size_t& size) {
  88.     bool* visited = new bool[size] {};
  89.     visited[v] = true;
  90.     size_t dist = 0;
  91.    
  92.     // check if graph has only one vertex
  93.     std::vector<size_t> adj = adjVertices(m, v, size, visited);
  94.     if (adj.empty())
  95.         return dist;
  96.     else
  97.         ++dist;
  98.    
  99.     // BFS Remix
  100.     std::queue<size_t> stack;
  101.     for (auto&& i : adj) {
  102.         visited[i] = true;
  103.         stack.push(i);
  104.     }
  105.  
  106.     while (!stack.empty()) {
  107.         size_t& p = stack.front();
  108.         stack.pop();
  109.        
  110.         adj = adjVertices(m, p, size, visited);
  111.         if (!adj.empty()) {
  112.             for (auto&& i : adj) {
  113.                     visited[i] = true;
  114.                     stack.push(i);
  115.                 }
  116.             ++dist;
  117.         }
  118.     }
  119.     delete[]visited;
  120.     return dist;
  121. }
  122.  
  123. std::vector<size_t> adjVertices(bool** m, const size_t& v, const size_t& size, bool* visited) {
  124.     std::vector<size_t> adj;
  125.     for (size_t i = 0; i < size; ++i)
  126.         if (m[v][i] && !visited[i])
  127.             adj.push_back(i);
  128.     return adj;
  129. }
Advertisement
Add Comment
Please, Sign In to add comment