@@ -24,26 +24,19 @@ auto cuts(const auto& adj, int m) {
2424 int n = sz (adj), num_bccs = 0 , q = 0 , s = 0 ;
2525 vi bcc_id (m, -1 ), is_cut (n), tin (n), st (m);
2626 auto dfs = [&](auto && self, int v, int p) -> int {
27- int low = tin[v] = ++q, deg = 0 ;
27+ int low = tin[v] = ++q;
2828 for (auto [u, e] : adj[v]) {
2929 assert (v != u);
3030 if (e == p) continue ;
31- if (!tin[u]) {
32- st[s++] = e;
33- int low_ch = self (self, u, e);
34- if (low_ch >= tin[v]) {
35- is_cut[v] = 1 ;
36- while (bcc_id[e] < 0 ) bcc_id[st[--s]] = num_bccs;
37- num_bccs++;
38- }
39- low = min (low, low_ch);
40- deg++;
41- } else if (tin[u] < tin[v]) {
42- st[s++] = e;
43- low = min (low, tin[u]);
31+ if (tin[u] < tin[v]) st[s++] = e;
32+ int lu = -1 ;
33+ low = min (low, tin[u] ?: (lu = self (self, u, e)));
34+ if (lu >= tin[v]) {
35+ is_cut[v] = p >= 0 || tin[v] + 1 < tin[u];
36+ while (bcc_id[e] < 0 ) bcc_id[st[--s]] = num_bccs;
37+ num_bccs++;
4438 }
4539 }
46- if (p == -1 ) is_cut[v] = (deg > 1 );
4740 return low;
4841 };
4942 rep (i, 0 , n) if (!tin[i]) dfs (dfs, i, -1 );
0 commit comments