Skip to content

Commit 73e5617

Browse files
committed
golf
1 parent 19f7aa1 commit 73e5617

File tree

3 files changed

+21
-25
lines changed

3 files changed

+21
-25
lines changed

library/graphs/strongly_connected_components/offline_incremental_scc.hpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ vi offline_incremental_scc(vector<array<int, 2>> eds,
3232
if (*it <= mid) adj[u].push_back(v);
3333
}
3434
for (int v : vs) ids[v] = -1;
35-
auto scc_id = sccs(adj).scc_id;
35+
auto scc_id = sccs(adj).second;
3636
auto split = partition(el, er, [&](int i) {
3737
return scc_id[eds[i][0]] == scc_id[eds[i][1]];
3838
});

library/graphs/strongly_connected_components/scc.hpp

Lines changed: 19 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -10,25 +10,22 @@
1010
//! for each edge u -> v: scc_id[u] >= scc_id[v]
1111
//! @time O(n + m)
1212
//! @space O(n)
13-
template<class G> struct sccs {
14-
int num_sccs = 0;
15-
vi scc_id;
16-
sccs(const G& adj): scc_id(sz(adj), -1) {
17-
int n = sz(adj), timer = 1;
18-
vi tin(n), st;
19-
auto dfs = [&](auto&& self, int v) -> int {
20-
int low = tin[v] = timer++, siz = sz(st);
21-
st.push_back(v);
22-
for (int u : adj[v])
23-
if (scc_id[u] < 0)
24-
low = min(low, tin[u] ? tin[u] : self(self, u));
25-
if (tin[v] == low) {
26-
rep(i, siz, sz(st)) scc_id[st[i]] = num_sccs;
27-
st.resize(siz);
28-
num_sccs++;
29-
}
30-
return low;
31-
};
32-
rep(i, 0, n) if (!tin[i]) dfs(dfs, i);
33-
}
34-
};
13+
template<class G> pair<int, vi> sccs(const G& adj) {
14+
int n = sz(adj), num_sccs = 0, timer = 0;
15+
vi scc_id(n, -1), tin(n), st;
16+
auto dfs = [&](auto&& self, int v) -> int {
17+
int low = tin[v] = ++timer, siz = sz(st);
18+
st.push_back(v);
19+
for (int u : adj[v])
20+
if (scc_id[u] < 0)
21+
low = min(low, tin[u] ?: self(self, u));
22+
if (tin[v] == low) {
23+
rep(i, siz, sz(st)) scc_id[st[i]] = num_sccs;
24+
st.resize(siz);
25+
num_sccs++;
26+
}
27+
return low;
28+
};
29+
rep(i, 0, n) if (!tin[i]) dfs(dfs, i);
30+
return {num_sccs, scc_id};
31+
}

tests/library_checker_aizu_tests/scc_asserts.hpp

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,5 @@ void scc_asserts(const vector<vector<int>>& adj) {
3434
assert(u != v);
3535
adj_copy[u].push_back(v);
3636
}
37-
sccs curr_res(adj_copy);
38-
assert(curr_res.num_sccs == 1);
37+
assert(sccs(adj_copy).first == 1);
3938
}

0 commit comments

Comments
 (0)