Skip to Content
Team NoteAlgorithmBCC

BCC

struct BCC { int N, next_dfsn = 0; vvi edges, bcc_v; vi dfsn, included; stack<pi> s; vector<vector<pi>> bcc_e; BCC(int N) : N(N), edges(N), dfsn(N, -1), included(N) {} void add_edge(int u, int v) { edges[u].pb(v), edges[v].pb(u); } int dfs(int cur, int p) { int ret = dfsn[cur] = next_dfsn++; for (int to: edges[cur]) { if (to == p) continue; if (dfsn[to] < dfsn[cur]) s.push({cur, to}); if (~dfsn[to]) { ret = min(ret, dfsn[to]); } else { int tmp = dfs(to, cur); ret = min(ret, tmp); if (tmp >= dfsn[cur]) { included[cur]++; bcc_v.emplace_back(), bcc_e.emplace_back(); while (1) { auto [u, v] = s.top(); s.pop(); bcc_e.back().pb({u, v}); bcc_v.back().pb(u), bcc_v.back().pb(v); if (mp(u, v) == mp(cur, to)) break; } uniq(bcc_v.back()); } } } return ret; } void build() { for (int i = 0; i < N; i++) if (dfsn[i] == -1) dfs(i, -1); else included[i]++; } };
Last updated on