Skip to content

Commit 3b69107

Browse files
lrvideckisweb-flow
andauthored
Nit example init (#141)
* nits to example init * [auto-verifier] verify commit ec84b7f * update bridge tests * [auto-verifier] verify commit d5b24be * fix * [auto-verifier] verify commit aba5e73 * I like this better * [auto-verifier] verify commit 97a7ac3 * fix cppcheck * [auto-verifier] verify commit 5517265 --------- Co-authored-by: GitHub <noreply@github.com>
1 parent c59af51 commit 3b69107

File tree

4 files changed

+53
-36
lines changed

4 files changed

+53
-36
lines changed

.verify-helper/timestamps.remote.json

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -50,10 +50,10 @@
5050
"tests/library_checker_aizu_tests/flow/dinic_aizu.test.cpp": "2024-11-17 14:04:03 -0600",
5151
"tests/library_checker_aizu_tests/flow/hungarian.test.cpp": "2024-11-17 14:04:03 -0600",
5252
"tests/library_checker_aizu_tests/flow/min_cost_max_flow.test.cpp": "2024-12-05 10:41:42 -0600",
53-
"tests/library_checker_aizu_tests/graphs/bcc_callback_aizu_bcc.test.cpp": "2025-06-23 20:35:49 -0600",
54-
"tests/library_checker_aizu_tests/graphs/bcc_callback_aizu_two_edge_cc.test.cpp": "2025-06-23 20:35:49 -0600",
55-
"tests/library_checker_aizu_tests/graphs/bcc_callback_lib_checker_bcc.test.cpp": "2025-06-23 20:35:49 -0600",
56-
"tests/library_checker_aizu_tests/graphs/bcc_callback_lib_checker_two_cc.test.cpp": "2025-06-23 20:35:49 -0600",
53+
"tests/library_checker_aizu_tests/graphs/bcc_callback_aizu_bcc.test.cpp": "2025-06-24 12:22:14 -0600",
54+
"tests/library_checker_aizu_tests/graphs/bcc_callback_aizu_two_edge_cc.test.cpp": "2025-06-24 12:25:50 -0600",
55+
"tests/library_checker_aizu_tests/graphs/bcc_callback_lib_checker_bcc.test.cpp": "2025-06-24 12:22:14 -0600",
56+
"tests/library_checker_aizu_tests/graphs/bcc_callback_lib_checker_two_cc.test.cpp": "2025-06-24 12:25:50 -0600",
5757
"tests/library_checker_aizu_tests/graphs/biconnected_components.test.cpp": "2025-02-10 23:30:47 -0700",
5858
"tests/library_checker_aizu_tests/graphs/connected_components_of_complement_graph.test.cpp": "2024-12-14 19:50:29 -0600",
5959
"tests/library_checker_aizu_tests/graphs/dijkstra_aizu.test.cpp": "2024-12-14 19:50:29 -0600",

library/graphs/bridges_cuts/bcc_callback.hpp

Lines changed: 21 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -3,36 +3,39 @@
33
//! @code
44
//! {
55
//! vector<vector<int>> adj(n);
6-
//! vector<pii> edges(m);
76
//! UF uf(n);
7+
//! vector<bool> seen(n);
88
//! bcc_callback(adj, [&](const vi& nodes) {
9-
//! if (sz(nodes) == 2) {
9+
//! int count_edges = 0;
10+
//! rep (i, 0, sz(nodes) - 1) {
11+
//! seen[nodes[i]] = 1;
12+
//! for (int v : adj[nodes[i]]) if (!seen[v]) {
13+
//! // edge nodes[i] <=> v is in current BCC
14+
//! count_edges++;
15+
//! }
16+
//! }
17+
//! if (count_edges == 1) {
1018
//! // nodes[0] <=> nodes[1] is a bridge
11-
//! // (if no multiple edges)
12-
//! // if multiple edges, then join them too in uf
1319
//! return;
1420
//! }
1521
//! for (int v : nodes) uf.join(v, nodes[0]);
1622
//! });
1723
//! vector<basic_string<int>> bridge_tree(n);
18-
//! for (auto [u, v] : edges)
19-
//! if (!uf.sameSet(u, v)) {
20-
//! u = uf.find(u), v = uf.find(v);
21-
//! bridge_tree[u] += v;
22-
//! bridge_tree[v] += u;
23-
//! }
24+
//! rep (i, 0, n)
25+
//! for (int v : adj[i])
26+
//! if (!uf.sameSet(i, v))
27+
//! bridge_tree[uf.find(i)] += uf.find(v);
2428
//! }
2529
//!
2630
//! vector<basic_string<int>> adj(n);
27-
//! vector<basic_string<array<int, 2>>> adj_edge_ids(n);
28-
//! vector<bool> seen(m);
31+
//! vector<basic_string<int>> block_vertex_tree(2 * n);
32+
//! int bcc_id = n;
2933
//! bcc_callback(adj, [&](const vi& nodes) {
30-
//! rep (i, 0, sz(nodes) - 1)
31-
//! for (auto [v, e_id] : adj_edge_ids[nodes[i]])
32-
//! if (!seen[e_id]) {
33-
//! seen[e_id] = 1;
34-
//! // this edge is in the current BCC
35-
//! }
34+
//! for (int v : nodes) {
35+
//! block_vertex_tree[v] += bcc_id;
36+
//! block_vertex_tree[bcc_id] += v;
37+
//! bcc_id++;
38+
//! }
3639
//! });
3740
//! @endcode
3841
//! callback not called on components with a single node

tests/library_checker_aizu_tests/graphs/bcc_callback_aizu_two_edge_cc.test.cpp

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -15,11 +15,23 @@ int main() {
1515
adj[v] += u;
1616
}
1717
vector<pii> bridges;
18+
vector<bool> seen(n);
1819
bcc_callback(adj, [&](const vi& nodes) {
19-
assert(sz(nodes) >= 2);
20-
if (sz(nodes) == 2)
21-
bridges.emplace_back(min(nodes[0], nodes[1]),
22-
max(nodes[0], nodes[1]));
20+
int count_edges = 0;
21+
rep(i, 0, sz(nodes) - 1) {
22+
seen[nodes[i]] = 1;
23+
count_edges += ranges::count_if(adj[nodes[i]],
24+
[&](int v) -> bool { return !seen[v]; });
25+
}
26+
if (count_edges == 1) {
27+
assert(sz(nodes) == 2);
28+
pii bridge(nodes[0], nodes[1]);
29+
if (bridge.first > bridge.second)
30+
swap(bridge.first, bridge.second);
31+
bridges.push_back(bridge);
32+
// nodes[0] <=> nodes[1] is a bridge
33+
return;
34+
}
2335
});
2436
ranges::sort(bridges);
2537
for (auto [u, v] : bridges)

tests/library_checker_aizu_tests/graphs/bcc_callback_lib_checker_two_cc.test.cpp

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -8,24 +8,26 @@ int main() {
88
int n, m;
99
cin >> n >> m;
1010
vector<basic_string<int>> adj(n);
11-
for (int i = 0; i < n; i++) adj[i] += i;
12-
vector<array<int, 2>> edges(m);
1311
for (int i = 0; i < m; i++) {
1412
int u, v;
1513
cin >> u >> v;
1614
adj[u] += v;
1715
adj[v] += u;
18-
if (u > v) swap(u, v);
19-
edges[i] = {u, v};
2016
}
2117
UF uf(n);
22-
ranges::sort(edges);
23-
for (int i = 1; i < m; i++)
24-
if (edges[i - 1] == edges[i])
25-
uf.join(edges[i][0], edges[i][1]);
18+
vector<bool> seen(n);
2619
bcc_callback(adj, [&](const vi& nodes) {
27-
assert(sz(nodes) >= 2);
28-
if (sz(nodes) == 2) return;
20+
int count_edges = 0;
21+
rep(i, 0, sz(nodes) - 1) {
22+
seen[nodes[i]] = 1;
23+
count_edges += ranges::count_if(adj[nodes[i]],
24+
[&](int v) -> bool { return !seen[v]; });
25+
}
26+
if (count_edges == 1) {
27+
assert(sz(nodes) == 2);
28+
// nodes[0] <=> nodes[1] is a bridge
29+
return;
30+
}
2931
for (int v : nodes) uf.join(v, nodes[0]);
3032
});
3133
vector<basic_string<int>> two_edge_ccs(n);

0 commit comments

Comments
 (0)