diff --git a/.verify-helper/timestamps.remote.json b/.verify-helper/timestamps.remote.json index 94e8d022..56b4595b 100644 --- a/.verify-helper/timestamps.remote.json +++ b/.verify-helper/timestamps.remote.json @@ -50,10 +50,10 @@ "tests/library_checker_aizu_tests/flow/dinic_aizu.test.cpp": "2024-11-17 14:04:03 -0600", "tests/library_checker_aizu_tests/flow/hungarian.test.cpp": "2024-11-17 14:04:03 -0600", "tests/library_checker_aizu_tests/flow/min_cost_max_flow.test.cpp": "2024-12-05 10:41:42 -0600", -"tests/library_checker_aizu_tests/graphs/bcc_callback_aizu_bcc.test.cpp": "2025-06-23 20:06:38 -0600", -"tests/library_checker_aizu_tests/graphs/bcc_callback_aizu_two_edge_cc.test.cpp": "2025-06-23 20:06:38 -0600", -"tests/library_checker_aizu_tests/graphs/bcc_callback_lib_checker_bcc.test.cpp": "2025-06-23 20:06:38 -0600", -"tests/library_checker_aizu_tests/graphs/bcc_callback_lib_checker_two_cc.test.cpp": "2025-06-23 20:06:38 -0600", +"tests/library_checker_aizu_tests/graphs/bcc_callback_aizu_bcc.test.cpp": "2025-06-23 20:30:30 -0600", +"tests/library_checker_aizu_tests/graphs/bcc_callback_aizu_two_edge_cc.test.cpp": "2025-06-23 20:30:30 -0600", +"tests/library_checker_aizu_tests/graphs/bcc_callback_lib_checker_bcc.test.cpp": "2025-06-23 20:30:30 -0600", +"tests/library_checker_aizu_tests/graphs/bcc_callback_lib_checker_two_cc.test.cpp": "2025-06-23 20:30:30 -0600", "tests/library_checker_aizu_tests/graphs/biconnected_components.test.cpp": "2025-02-10 23:30:47 -0700", "tests/library_checker_aizu_tests/graphs/connected_components_of_complement_graph.test.cpp": "2024-12-14 19:50:29 -0600", "tests/library_checker_aizu_tests/graphs/dijkstra_aizu.test.cpp": "2024-12-14 19:50:29 -0600", diff --git a/library/graphs/bridges_cuts/bcc_callback.hpp b/library/graphs/bridges_cuts/bcc_callback.hpp index 45b01d24..57e4ece5 100644 --- a/library/graphs/bridges_cuts/bcc_callback.hpp +++ b/library/graphs/bridges_cuts/bcc_callback.hpp @@ -6,8 +6,12 @@ //! vector edges(m); //! UF uf(n); //! bcc_callback(adj, [&](const vi& nodes) { -//! if (sz(nodes) == 2) -//! return; // is bridge assuming no multiple edges +//! if (sz(nodes) == 2) { +//! // nodes[0] <=> nodes[1] is a bridge +//! // (if no multiple edges) +//! // if multiple edges, then join them too in uf +//! return; +//! } //! for (int v : nodes) uf.join(v, nodes[0]); //! }); //! vector> bridge_tree(n); diff --git a/tests/library_checker_aizu_tests/graphs/bcc_callback_lib_checker_two_cc.test.cpp b/tests/library_checker_aizu_tests/graphs/bcc_callback_lib_checker_two_cc.test.cpp index ab6d4a7a..d1ab983d 100644 --- a/tests/library_checker_aizu_tests/graphs/bcc_callback_lib_checker_two_cc.test.cpp +++ b/tests/library_checker_aizu_tests/graphs/bcc_callback_lib_checker_two_cc.test.cpp @@ -8,32 +8,25 @@ int main() { int n, m; cin >> n >> m; vector> adj(n); - vector>> adj_e_id(n); - for (int i = 0; i < n; i++) { - adj[i] += i; - adj_e_id[i] += {i, i}; - } + for (int i = 0; i < n; i++) adj[i] += i; + vector> edges(m); for (int i = 0; i < m; i++) { int u, v; cin >> u >> v; adj[u] += v; adj[v] += u; - adj_e_id[u] += {v, n + i}; - adj_e_id[v] += {u, n + i}; + if (u > v) swap(u, v); + edges[i] = {u, v}; } UF uf(n); - vector seen(n + m); + ranges::sort(edges); + for (int i = 1; i < m; i++) + if (edges[i - 1] == edges[i]) + uf.join(edges[i][0], edges[i][1]); bcc_callback(adj, [&](const vi& nodes) { assert(sz(nodes) >= 2); - int cnt_edges = 0; - rep(i, 0, sz(nodes) - 1) for (auto [v, e_id] : - adj_e_id[nodes[i]]) if (!seen[e_id] && - v != nodes[i]) { - seen[e_id] = 1; - cnt_edges++; - } - if (cnt_edges >= 2) - for (int v : nodes) uf.join(v, nodes[0]); + if (sz(nodes) == 2) return; + for (int v : nodes) uf.join(v, nodes[0]); }); vector> two_edge_ccs(n); rep(i, 0, n) two_edge_ccs[uf.find(i)] += i;