Skip to content

Commit 413c013

Browse files
lrvideckisweb-flow
andauthored
Cd nit (#214)
* nit * [auto-verifier] verify commit 3297a4d * more golf!!!!!!! * [auto-verifier] verify commit aa6732e * another golf * [auto-verifier] verify commit 02ae4c6 * fix formatting --------- Co-authored-by: GitHub <noreply@github.com>
1 parent 3452bba commit 413c013

5 files changed

Lines changed: 23 additions & 24 deletions

File tree

.verify-helper/timestamps.remote.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,7 @@
7474
"tests/library_checker_aizu_tests/graphs/strongly_connected_components_aizu.test.cpp": "2026-04-12 16:21:27 -0600",
7575
"tests/library_checker_aizu_tests/graphs/strongly_connected_components_lib_checker.test.cpp": "2026-04-12 16:21:27 -0600",
7676
"tests/library_checker_aizu_tests/graphs/two_edge_components.test.cpp": "2026-04-12 16:21:27 -0600",
77-
"tests/library_checker_aizu_tests/handmade_tests/count_paths.test.cpp": "2026-04-12 16:21:27 -0600",
77+
"tests/library_checker_aizu_tests/handmade_tests/count_paths.test.cpp": "2026-04-26 01:58:54 -0600",
7878
"tests/library_checker_aizu_tests/handmade_tests/dsu.test.cpp": "2026-01-22 10:08:22 -0700",
7979
"tests/library_checker_aizu_tests/handmade_tests/edge_cd_small_trees.test.cpp": "2026-04-12 16:21:27 -0600",
8080
"tests/library_checker_aizu_tests/handmade_tests/fib_matrix_expo.test.cpp": "2026-01-28 21:48:16 -0700",
@@ -131,7 +131,7 @@
131131
"tests/library_checker_aizu_tests/strings/suffix_array_short.test.cpp": "2026-04-12 06:15:25 -0600",
132132
"tests/library_checker_aizu_tests/strings/trie.test.cpp": "2026-01-17 12:38:18 -0700",
133133
"tests/library_checker_aizu_tests/strings/wildcard_pattern_matching.test.cpp": "2025-08-05 19:19:23 -0600",
134-
"tests/library_checker_aizu_tests/trees/cd_count_paths_per_length.test.cpp": "2026-04-12 17:51:15 -0400",
134+
"tests/library_checker_aizu_tests/trees/cd_count_paths_per_length.test.cpp": "2026-04-26 01:58:54 -0600",
135135
"tests/library_checker_aizu_tests/trees/edge_cd_contour_range_query.test.cpp": "2026-04-12 16:21:27 -0600",
136136
"tests/library_checker_aizu_tests/trees/edge_cd_contour_range_update.test.cpp": "2026-04-12 16:21:27 -0600",
137137
"tests/library_checker_aizu_tests/trees/edge_cd_count_paths_per_length.test.cpp": "2026-04-12 16:21:27 -0600",

library/trees/centroid_decomp.hpp

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,25 @@
11
#pragma once
22
//! @code
33
//! vector<basic_string<int>> g(n);
4-
//! centroid(g, [&](int cent, int par_cent) {});
4+
//! vi par = cd(g, [&](int cent) {});
55
//! @endcode
66
//! @time O(n log n)
77
//! @space O(n)
8-
void centroid(auto& g, auto f) {
9-
vi siz(sz(g));
8+
vi cd(auto& g, auto f) {
9+
vi p(sz(g), -1), s(sz(g), sz(g));
1010
auto ctd = [&](auto ctd, int u, int p, int n) -> int {
11-
siz[u] = 1;
11+
s[u] = 1;
1212
for (int v : g[u])
1313
if (v != p) {
1414
if (int c = ctd(ctd, v, u, n); c != -1) return c;
15-
siz[u] += siz[v];
15+
s[u] += s[v];
1616
}
17-
return 2 * siz[u] >= n ? siz[p] = n - siz[u], u : -1;
17+
return 2 * s[u] >= n ? s[p] = n - s[u], u : -1;
1818
};
19-
auto dfs = [&](auto dfs, int u, int p, int n) -> void {
20-
f(u = ctd(ctd, u, u, n), p);
21-
for (int v : g[u])
22-
erase(g[v], u), dfs(dfs, v, u, siz[v]);
19+
auto dfs = [&](auto dfs, int u) -> int {
20+
f(u = ctd(ctd, u, u, s[u]));
21+
for (int v : g[u]) erase(g[v], u), p[dfs(dfs, v)] = u;
22+
return u;
2323
};
24-
dfs(dfs, 0, -1, sz(g));
24+
return dfs(dfs, 0), p;
2525
}

tests/library_checker_aizu_tests/cd_asserts.hpp

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -3,25 +3,24 @@
33
void cd_asserts(vector<vector<int>> adj) {
44
vector<int> decomp_size(sz(adj), -1);
55
vector<int> naive_par_decomp(sz(adj), -1);
6-
centroid(adj, [&](int cent, int par_cent) -> void {
7-
assert(naive_par_decomp[cent] == par_cent);
6+
vi par = cd(adj, [&](int cent) -> void {
87
assert(decomp_size[cent] == -1);
98
auto dfs = [&](auto&& self, int u, int p) -> int {
10-
naive_par_decomp[u] = cent;
9+
if (p != -1) naive_par_decomp[u] = cent;
1110
int sub_size = 1;
1211
for (int v : adj[u])
1312
if (v != p) sub_size += self(self, v, u);
1413
return sub_size;
1514
};
1615
decomp_size[cent] = dfs(dfs, cent, -1);
17-
if (par_cent != -1)
18-
assert(1 <= decomp_size[cent] &&
19-
2 * decomp_size[cent] <= decomp_size[par_cent]);
2016
for (int u : adj[cent]) {
2117
int sz_subtree = dfs(dfs, u, cent);
22-
assert(1 <= sz_subtree &&
23-
2 * sz_subtree <= decomp_size[cent]);
18+
assert(1 <= sz_subtree && 2 * sz_subtree <= decomp_size[cent]);
2419
}
2520
});
26-
rep(i, 0, sz(adj)) assert(decomp_size[i] >= 1);
21+
assert(par == naive_par_decomp);
22+
rep(i, 0, sz(adj)) {
23+
assert(decomp_size[i] >= 1);
24+
if (par[i] != -1) assert(2 * decomp_size[i] <= decomp_size[par[i]]);
25+
}
2726
}

tests/library_checker_aizu_tests/handmade_tests/count_paths.test.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717
//! which are all O(n)
1818
vector<ll> count_paths_per_node(vector<vi> adj, int k) {
1919
vector<ll> num_paths(sz(adj));
20-
centroid(adj, [&](int cent, int) {
20+
cd(adj, [&](int cent) {
2121
vector pre_d{1}, cur_d{0};
2222
auto dfs = [&](auto&& self, int u, int p,
2323
int d) -> ll {

tests/library_checker_aizu_tests/trees/cd_count_paths_per_length.test.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
//! which are each O(n)
1212
vector<ll> count_paths_per_length(vector<vi> adj) {
1313
vector<ll> num_paths(sz(adj));
14-
centroid(adj, [&](int cent, int) {
14+
cd(adj, [&](int cent) {
1515
vector<vector<double>> child_depths;
1616
for (int v : adj[cent]) {
1717
child_depths.emplace_back(1, 0.0);

0 commit comments

Comments
 (0)