Advertisement
RaFiN_

block cut tree

Feb 28th, 2019
131
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.56 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3.  
  4. /*
  5.     all nodes are completely renamed
  6.     BC contains the block-cut tree
  7.     NN is total nodes in BCT
  8.     u in original graph is in node[u] in BCT
  9.     if ap[u] == true, then u is articulation point in original graph
  10.     if cut[u] == true, then u is a cut node in BCT, else this represents a biconnected component
  11. */
  12.  
  13. const int M=100010;
  14.  
  15. int disc[M], low[M], parent[M], ap[M];
  16. int node[M], cut[M];
  17. vector<int> A[M], BC[M];
  18. stack< pair<int, int> >_stack;
  19. vector<int> _temp;
  20. int NN;
  21.  
  22. void extract_biconnected_component(int u = -1, int v = -1)
  23. {
  24.     int id = ++NN;
  25.     _temp.clear();
  26.  
  27.     while (!_stack.empty())
  28.     {
  29.          pair<int, int>  t = _stack.top();
  30.         _stack.pop();
  31.         _temp.push_back(t.first), _temp.push_back(t.second);
  32.         if (t == make_pair(u, v)) break;
  33.     }
  34.  
  35.     sort(_temp.begin(), _temp.end());
  36.     _temp.erase(unique(_temp.begin(), _temp.end()), _temp.end());
  37.  
  38.     for (int i=0; i<_temp.size(); i++)
  39.     {
  40.         int u = _temp[i];
  41.         if (ap[u])
  42.         {
  43.             if (node[u] == -1) node[u] = ++NN;
  44.             cut[node[u]] = true;
  45.  
  46.             BC[node[u]].push_back(id);
  47.             BC[id].push_back(node[u]);
  48.         }
  49.         else node[u] = id;
  50.     }
  51. }
  52.  
  53. void dfs_visit(int u)
  54. {
  55.     static int time = 0;
  56.     int children = 0;
  57.  
  58.     disc[u] = low[u] = ++time;
  59.  
  60.     for (int i=0; i<A[u].size(); i++)
  61.     {
  62.         int v = A[u][i];
  63.         if (disc[v] == -1)
  64.         {
  65.             _stack.push(make_pair(u, v));
  66.             children++;
  67.             parent[v] = u;
  68.             dfs_visit(v);
  69.  
  70.             low[u]  = min(low[u], low[v]);
  71.             if ((parent[u] == -1 && children > 1) || (parent[u] != -1 && low[v] >= disc[u]))
  72.             {
  73.                 ap[u] = true;
  74.                 extract_biconnected_component(u, v);
  75.             }
  76.         }
  77.         else if (v != parent[u] && disc[v] < disc[u])
  78.         {
  79.             _stack.push(make_pair(u, v));
  80.             low[u]  = min(low[u], disc[v]);
  81.         }
  82.     }
  83.  
  84.     if (parent[u] == -1) extract_biconnected_component();
  85. }
  86.  
  87. void block_cut(int n)
  88. {
  89.     int i, j, k;
  90.     NN = 0;
  91.     for (i=0; i<=n; i++) {
  92.         disc[i] = -1;
  93.         ap[i] = 0;
  94.         parent[i] = -1;
  95.         node[i] = -1;
  96.         cut[i] = 0;
  97.     }
  98.     for (i=1; i<=n; i++) if (disc[i] == -1) dfs_visit(i);
  99. }
  100.  
  101. int main()
  102. {
  103.     int n, m, i, j, k;
  104.  
  105.     cin>>n>>m;
  106.     while (m--)
  107.     {
  108.         cin>>i>>j;
  109.         A[i].push_back(j);
  110.         A[j].push_back(i);
  111.     }
  112.     block_cut(n);
  113.  
  114.  
  115.     return 0;
  116. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement