olexander_dan

Untitled

Aug 2nd, 2019
284
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.82 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);
  9.  
  10.  
  11. int main() {
  12.     // ADJACENCY MATRIX EMULATION
  13.     constexpr size_t n = 5;
  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][2] = matrix[2][1] = true;
  21.     matrix[2][4] = matrix[4][2] = true;
  22.     matrix[3][4] = matrix[4][3] = true;
  23.     // 0 1 1 0 0
  24.     // 1 0 1 0 0
  25.     // 1 1 0 0 1
  26.     // 0 0 0 0 1
  27.     // 0 0 1 1 0
  28.     ///////////////////////////////
  29.    
  30.     size_t* resultM = maxDist(matrix, n);
  31.     for (size_t i = 0; i < n; ++i)
  32.         std::cout << i << ": " << resultM[i] << std::endl;
  33.    
  34.     system("pause");
  35.     return 0;
  36. }
  37.  
  38. size_t* maxDist(bool** m, const size_t& size) {
  39.     size_t* resDist = new size_t[size];
  40.     for (size_t i = 0; i < size; ++i) {
  41.         resDist[i] = maxDistUtil(m, i, size);
  42.     }
  43.     return resDist;
  44. }
  45.  
  46. size_t maxDistUtil(bool** m, const size_t& v, const size_t& size) {
  47.     bool* visited = new bool[size] {};
  48.     visited[v] = true;
  49.  
  50.     size_t dist = 0;
  51.     std::queue<size_t> stack;
  52.     for (auto&& i : adjVertices(m, v, size))
  53.         stack.push(i);
  54.  
  55.     while (!stack.empty()) {
  56.         size_t& p = stack.front();
  57.         stack.pop();
  58.        
  59.  
  60.         for (auto&& i : adjVertices(m, p, size)) {
  61.             if (!visited[i]) {
  62.                 visited[i] = true;
  63.                 stack.push(i);
  64.                 ++dist;
  65.             }
  66.         }
  67.         visited[p] = true;
  68.     }
  69.     delete[]visited;
  70.     return dist;
  71. }
  72.  
  73. std::vector<size_t> adjVertices(bool** m, const size_t& v, const size_t& size) {
  74.     std::vector<size_t> adj;
  75.     for (size_t i = 0; i < size; ++i)
  76.         if (m[v][i])
  77.             adj.push_back(i);
  78.     return adj;
  79. }
Advertisement
Add Comment
Please, Sign In to add comment