|
14 | 14 | //! adj[u] += {v, i}; |
15 | 15 | //! adj[v] += {u, i}; |
16 | 16 | //! } |
17 | | -//! auto [num_bccs, bcc_id, is_cut] = cuts(adj, m); |
| 17 | +//! cuts_callback(adj, [&](int v, const vi& nodes_bcc) { |
| 18 | +//! }); |
18 | 19 | //! @endcode |
19 | 20 | //! @time O(n + m) |
20 | 21 | //! @space O(n + m) |
21 | | -/* |
22 | | -auto cuts(const auto& adj, int m) { |
23 | | - int n = sz(adj), num_bccs = 0, q = 0, s = 0; |
24 | | - vi bcc_id(m, -1), is_cut(n), tin(n), st(m); |
25 | | - auto dfs = [&](auto&& self, int v, int p) -> int { |
26 | | - int low = tin[v] = ++q; |
27 | | - for (auto [u, e] : adj[v]) { |
28 | | - assert(v != u); |
29 | | - if (e == p) continue; |
30 | | - if (tin[u] < tin[v]) st[s++] = e; |
31 | | - int lu = -1; |
32 | | - low = min(low, tin[u] ?: (lu = self(self, u, e))); |
33 | | - if (lu >= tin[v]) { |
34 | | - is_cut[v] = p >= 0 || tin[v] + 1 < tin[u]; |
35 | | - while (bcc_id[e] < 0) bcc_id[st[--s]] = num_bccs; |
36 | | - num_bccs++; |
37 | | - } |
38 | | - } |
39 | | - return low; |
40 | | - }; |
41 | | - rep(i, 0, n) if (!tin[i]) dfs(dfs, i, -1); |
42 | | - return tuple{num_bccs, bcc_id, is_cut}; |
43 | | -} |
44 | | -*/ |
45 | 22 | void cuts_callback(const auto& adj, auto f) { |
46 | | - int n = ssize(adj), q = 0, s = 0; |
47 | | - vector<int> tin(n), st(n); |
| 23 | + int n = sz(adj), q = 0, s = 0; |
| 24 | + vi tin(n), st(n); |
48 | 25 | auto dfs = [&](auto&& self, int v, int p) -> int { |
49 | 26 | int low = tin[v] = ++q; |
50 | | - for (int u : adj[v]) if (u != p) { |
51 | | - int siz = s, lu = 0; |
52 | | - low = min(low, tin[u] ?: (lu = self(self, st[s++] = u, v))); |
53 | | - if (lu >= tin[v]) { |
54 | | - f(v, vector<int>(begin(st) + siz, begin(st) + s)); |
55 | | - s = siz; |
| 27 | + for (int u : adj[v]) |
| 28 | + if (u != p) { |
| 29 | + int siz = s, lu = 0; |
| 30 | + low = min(low, |
| 31 | + tin[u] ?: (lu = self(self, st[s++] = u, v))); |
| 32 | + if (lu >= tin[v]) |
| 33 | + f(st[s] = v, vi(siz + all(st) - (n - s))), |
| 34 | + s = siz; |
56 | 35 | } |
57 | | - } |
58 | 36 | return low; |
59 | 37 | }; |
60 | | - for (int i = 0; i <n; i++) if (!tin[i]) dfs(dfs, i, i); |
| 38 | + rep(i, 0, n) if (!tin[i]) dfs(dfs, i, i); |
61 | 39 | } |
0 commit comments