Skip to content

Commit 3297a4d

Browse files
committed
nit
1 parent 3452bba commit 3297a4d

3 files changed

Lines changed: 19 additions & 22 deletions

File tree

library/trees/centroid_decomp.hpp

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
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), siz(p);
1010
auto ctd = [&](auto ctd, int u, int p, int n) -> int {
1111
siz[u] = 1;
1212
for (int v : g[u])
@@ -16,10 +16,10 @@ void centroid(auto& g, auto f) {
1616
}
1717
return 2 * siz[u] >= n ? siz[p] = n - siz[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 n) -> int {
20+
f(u = ctd(ctd, u, u, n));
21+
for (int v : g[u]) erase(g[v], u), p[dfs(dfs, v, siz[v])] = u;
22+
return u;
2323
};
24-
dfs(dfs, 0, -1, sz(g));
24+
return dfs(dfs, 0, sz(g)), 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/trees/cd_count_paths_per_length.test.cpp

Lines changed: 3 additions & 5 deletions
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);
@@ -29,15 +29,13 @@ vector<ll> count_paths_per_length(vector<vi> adj) {
2929
swap(q, new_q);
3030
}
3131
}
32-
sort(all(child_depths),
33-
[&](auto& x, auto& y) { return sz(x) < sz(y); });
32+
sort(all(child_depths), [&](auto& x, auto& y) { return sz(x) < sz(y); });
3433
vector total_depth(1, 1.0);
3534
for (const auto& cnt_depth : child_depths) {
3635
auto prod = conv(total_depth, cnt_depth);
3736
rep(i, 1, sz(prod)) num_paths[i] += llround(prod[i]);
3837
total_depth.resize(sz(cnt_depth));
39-
rep(i, 1, sz(cnt_depth)) total_depth[i] +=
40-
cnt_depth[i];
38+
rep(i, 1, sz(cnt_depth)) total_depth[i] += cnt_depth[i];
4139
}
4240
});
4341
return num_paths;

0 commit comments

Comments
 (0)