Matrix_code

graph - Biconnected Component

Jul 17th, 2017 (edited)
164
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.36 KB | None | 0 0
  1. /*
  2. Output The biconnected Component of an undirected graph
  3. 0 - base indexing
  4. use init first. adde then.
  5. bc[i] = # of i biconnected component.
  6. */
  7.  
  8. #include <bits/stdc++.h>
  9. #define FO(i,a,b) for (int i = (a); i < (b); i++)
  10. #define sz(v) int(v.size())
  11.  
  12. using namespace std;
  13. struct bcc {
  14.     vector<vector<int> > u;
  15.     vector<int> bc, lo, ind,SZ;
  16.     vector<vector<int> > G;
  17.     int T, m, n;
  18.  
  19.     void init(int n_) {
  20.         n = n_; m = 0; T = 0;
  21.         u.clear(); u.resize(n);
  22.         G.clear(); G.resize(n);
  23.         bc.assign(n,-1);
  24.         lo.assign(n,-1);
  25.         SZ.assign(n,0);
  26.         ind.assign(n,-1);
  27.  
  28.     }
  29.  
  30.     void adde(int i, int j) {
  31.         u[i].push_back(j);
  32.         u[j].push_back(i);
  33.     }
  34.  
  35.     vector<int> stk;
  36.     void go(int i, int p) {
  37.         ind[i] = lo[i] = ++T;
  38.         stk.push_back(i);
  39.  
  40.         for (int j : u[i]) if (j != p) {
  41.             if (ind[j] == -1) {
  42.                 go(j, i);
  43.                 lo[i] = min(lo[i],lo[j]);
  44.             } else {
  45.                 lo[i] = min(lo[i],ind[j]);
  46.             }
  47.         } else p = -1;
  48.  
  49.         if (ind[i] == lo[i]) {
  50.             int t;
  51.             do {
  52.                 t = stk.back(); stk.pop_back();
  53.                 bc[t] = m;
  54.             } while (t != i);
  55.             m++;
  56.         }
  57.     }
  58.  
  59.     void dobcc() {
  60.         FO(i,0,n) if (ind[i] == -1) go(i,-1);
  61.     }
  62. };
Add Comment
Please, Sign In to add comment