Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #define Edge pair<int,int>
- #define ff first
- #define ss second
- int cnt = 0,bcc_cnt = 0;
- vector<int> G[MAXN],bcc[MAXN];
- int pre[MAXN],low[MAXN],iscut[MAXN],bccno[MAXN];
- stack<Edge> S;
- void DFS(int u,int p)
- {
- low[u] = pre[u] = ++cnt;
- int child = 0;
- for(auto v : G[u])
- {
- Edge e = {u,v};
- if(!pre[v])
- {
- S.push(e);
- child ++;
- DFS(v,u);
- low[u] = min(low[u],low[v]);
- if(low[v] >= pre[u])
- {
- iscut[u] = 1;
- bcc_cnt++;
- while(1)
- {
- Edge x = S.top();S.pop();
- if(bccno[x.ff] != bcc_cnt)
- {
- bccno[x.ff] = bcc_cnt;
- bcc[bcc_cnt].push_back(x.ff);
- }
- if(bccno[x.ss] != bcc_cnt)
- {
- bccno[x.ss] = bcc_cnt;
- bcc[bcc_cnt].push_back(x.ss);
- }
- if(x.ff == u && x.ss == v) break;
- }
- }
- }
- else if(pre[v] < pre[u] && v != p)
- {
- S.push(e);
- low[u] = min(low[u],pre[v]);
- }
- }
- if(p <= 0 && child == 1)
- {
- iscut[u] = 0;
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement