olexander_dan

Untitled

Aug 3rd, 2019
287
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.61 KB | None | 0 0
  1. // Find max distance for each vertex in graph
  2. #include <iostream>
  3. #include <vector>
  4. #include <set>
  5.  
  6. const std::vector<size_t> maxDist(const std::vector<std::vector<size_t>>&);
  7. size_t maxDistUtil(const std::vector<std::vector<size_t>>&, const size_t&);
  8. size_t maxVal(const std::vector<size_t>&);
  9.  
  10.  
  11. int main() {
  12.     constexpr size_t n = 4;
  13.     std::vector<std::vector<size_t>> graph(n);
  14.     graph[0] = { 1, 2 };
  15.     graph[1] = { 3 };
  16.     graph[2] = { 1, 3 };
  17.  
  18.     const std::vector<size_t>& resultM = maxDist(graph);
  19.     for (size_t i = 0; i < resultM.size(); ++i)
  20.         std::cout << i << ": " << resultM[i] << std::endl;
  21.    
  22.     system("pause");
  23.     return 0;
  24. }
  25.  
  26. const std::vector<size_t> maxDist(const std::vector<std::vector<size_t>>& graph) {
  27.     const size_t& n = graph.size();
  28.     std::vector<size_t> res(n);
  29.     for (size_t i = 0; i < n; ++i)
  30.         res[i] = maxDistUtil(graph, i);
  31.     return res;
  32. }
  33.  
  34. size_t maxDistUtil(const std::vector<std::vector<size_t>>& graph, const size_t& s) {
  35.     const size_t& n = graph.size();
  36.     std::vector<size_t> d(n, UINT_MAX);
  37.     d[s] = 0;
  38.     std::set<std::pair<size_t, size_t>> q; // dist, number of vertex
  39.     q.insert(std::make_pair(d[s], s));
  40.     while (!q.empty()) {
  41.         size_t v = q.begin()->second;
  42.         q.erase(q.begin());
  43.  
  44.         for (size_t j = 0; j < graph[v].size(); ++j) {
  45.             size_t to = graph[v][j];
  46.             if (d[v] + 1 < d[to]) {
  47.                 q.erase(std::make_pair(d[to], to));
  48.                 d[to] = d[v] + 1;
  49.                 q.insert(std::make_pair(d[to], to));
  50.             }
  51.         }
  52.     }
  53.     return maxVal(d);
  54. }
  55.  
  56. size_t maxVal(const std::vector<size_t>& d) {
  57.     size_t max = 0;
  58.     for (const size_t& i : d)
  59.         if (i < d.size() && i > max)
  60.             max = i;
  61.     return max;
  62. }
Advertisement
Add Comment
Please, Sign In to add comment