Skip to content

Commit 596f983

Browse files
committed
golf
1 parent d853d76 commit 596f983

File tree

3 files changed

+26
-30
lines changed

3 files changed

+26
-30
lines changed

library/graphs/bridges_cuts/bridges.hpp

Lines changed: 10 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -20,18 +20,17 @@
2020
//! @time O(n + m)
2121
//! @space O(n + m)
2222
auto bridges(const auto& adj, int m) {
23-
int n = sz(adj), num_ccs = 0, timer = 0;
24-
vi br_id(n, -1), is_br(m), tin(n), st;
25-
auto dfs = [&](auto&& self, int v, int p_id) -> int {
26-
int low = tin[v] = ++timer, siz = sz(st);
27-
st.push_back(v);
28-
for (auto [u, e_id] : adj[v])
29-
if (e_id != p_id && br_id[u] < 0)
30-
low = min(low, tin[u] ?: self(self, u, e_id));
23+
int n = sz(adj), num_ccs = 0, q = 0, s = 0;
24+
vi br_id(n, -1), is_br(m), tin(n), st(n);
25+
auto dfs = [&](auto&& self, int v, int p) -> int {
26+
int low = tin[v] = ++q;
27+
st[s++] = v;
28+
for (auto [u, e] : adj[v])
29+
if (e != p && br_id[u] < 0)
30+
low = min(low, tin[u] ?: self(self, u, e));
3131
if (tin[v] == low) {
32-
if (p_id != -1) is_br[p_id] = 1;
33-
rep(i, siz, sz(st)) br_id[st[i]] = num_ccs;
34-
st.resize(siz);
32+
if (p != -1) is_br[p] = 1;
33+
while (br_id[v] < 0) br_id[st[--s]] = num_ccs;
3534
num_ccs++;
3635
}
3736
return low;

library/graphs/bridges_cuts/cuts.hpp

Lines changed: 11 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -21,31 +21,29 @@
2121
//! @time O(n + m)
2222
//! @space O(n + m)
2323
auto cuts(const auto& adj, int m) {
24-
int n = sz(adj), num_bccs = 0, timer = 0;
25-
vi bcc_id(m, -1), is_cut(n), tin(n), st;
26-
auto dfs = [&](auto&& self, int v, int p_id) -> int {
27-
int low = tin[v] = ++timer, deg = 0;
28-
for (auto [u, e_id] : adj[v]) {
24+
int n = sz(adj), num_bccs = 0, q = 0, s = 0;
25+
vi bcc_id(m, -1), is_cut(n), tin(n), st(m);
26+
auto dfs = [&](auto&& self, int v, int p) -> int {
27+
int low = tin[v] = ++q, deg = 0;
28+
for (auto [u, e] : adj[v]) {
2929
assert(v != u);
30-
if (e_id == p_id) continue;
30+
if (e == p) continue;
3131
if (!tin[u]) {
32-
int siz = sz(st);
33-
st.push_back(e_id);
34-
int low_ch = self(self, u, e_id);
32+
st[s++] = e;
33+
int low_ch = self(self, u, e);
3534
if (low_ch >= tin[v]) {
3635
is_cut[v] = 1;
37-
rep(i, siz, sz(st)) bcc_id[st[i]] = num_bccs;
38-
st.resize(siz);
36+
while (bcc_id[e] < 0) bcc_id[st[--s]] = num_bccs;
3937
num_bccs++;
4038
}
4139
low = min(low, low_ch);
4240
deg++;
4341
} else if (tin[u] < tin[v]) {
44-
st.push_back(e_id);
42+
st[s++] = e;
4543
low = min(low, tin[u]);
4644
}
4745
}
48-
if (p_id == -1) is_cut[v] = (deg > 1);
46+
if (p == -1) is_cut[v] = (deg > 1);
4947
return low;
5048
};
5149
rep(i, 0, n) if (!tin[i]) dfs(dfs, i, -1);

library/graphs/strongly_connected_components/scc.hpp

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -13,17 +13,16 @@
1313
//! @time O(n + m)
1414
//! @space O(n)
1515
auto sccs(const auto& adj) {
16-
int n = sz(adj), num_sccs = 0, timer = 0;
17-
vi scc_id(n, -1), tin(n), st;
16+
int n = sz(adj), num_sccs = 0, q = 0, s = 0;
17+
vi scc_id(n, -1), tin(n), st(n);
1818
auto dfs = [&](auto&& self, int v) -> int {
19-
int low = tin[v] = ++timer, siz = sz(st);
20-
st.push_back(v);
19+
int low = tin[v] = ++q;
20+
st[s++] = v;
2121
for (int u : adj[v])
2222
if (scc_id[u] < 0)
2323
low = min(low, tin[u] ?: self(self, u));
2424
if (tin[v] == low) {
25-
rep(i, siz, sz(st)) scc_id[st[i]] = num_sccs;
26-
st.resize(siz);
25+
while (scc_id[v] < 0) scc_id[st[--s]] = num_sccs;
2726
num_sccs++;
2827
}
2928
return low;

0 commit comments

Comments
 (0)