Skip to content

Commit 436c40a

Browse files
committed
golf
1 parent aab645f commit 436c40a

2 files changed

Lines changed: 15 additions & 18 deletions

File tree

library/trees/centroid_decomp.hpp

Lines changed: 12 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -7,22 +7,20 @@
77
//! @space O(n)
88
void centroid(auto& g, auto f) {
99
vi siz(sz(g));
10-
auto dfs_sz = [&](auto&& dfs_sz, int u, int p) -> void {
10+
auto cnt = [&](auto&& cnt, int u, int p, int n) -> int {
1111
siz[u] = 1;
1212
for (int v : g[u])
13-
if (v != p) dfs_sz(dfs_sz, v, u), siz[u] += siz[v];
13+
if (v != p) {
14+
int c = cnt(cnt, v, u, n);
15+
if (c != -1) return c;
16+
siz[u] += siz[v];
17+
}
18+
return 2 * siz[u] >= n ? siz[p] = n - siz[u], u : -1;
1419
};
15-
auto dfs = [&](auto&& dfs, int u, int p) -> void {
16-
dfs_sz(dfs_sz, u, -1);
17-
for (int w = -1, sz_root = siz[u];;) {
18-
auto big_ch = ranges::find_if(g[u], [&](int v) {
19-
return v != w && 2 * siz[v] > sz_root;
20-
});
21-
if (big_ch == end(g[u])) break;
22-
w = u, u = *big_ch;
23-
}
24-
f(u, p);
25-
for (int v : g[u]) erase(g[v], u), dfs(dfs, v, u);
20+
auto dfs = [&](auto&& dfs, int u, int p, int n) -> void {
21+
f(u = cnt(cnt, u, u, n), p);
22+
for (int v : g[u])
23+
erase(g[v], u), dfs(dfs, v, u, siz[v]);
2624
};
27-
dfs(dfs, 0, -1);
25+
dfs(dfs, 0, -1, sz(g));
2826
}

library/trees/edge_cd.hpp

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -15,12 +15,11 @@
1515
//! @space O(n)
1616
template<class G> void edge_cd(vector<G>& g, auto f) {
1717
vi siz(sz(g));
18-
auto cent = [&](auto&& cent, int u, int p,
19-
int m) -> int {
18+
auto cnt = [&](auto&& cnt, int u, int p, int m) -> int {
2019
siz[u] = 1;
2120
for (int v : g[u])
2221
if (v != p) {
23-
int c = cent(cent, v, u, m);
22+
int c = cnt(cnt, v, u, m);
2423
if (c != -1) return c;
2524
siz[u] += siz[v];
2625
}
@@ -29,7 +28,7 @@ template<class G> void edge_cd(vector<G>& g, auto f) {
2928
};
3029
auto dfs = [&](auto&& dfs, int u, int m) -> void {
3130
if (m < 2) return;
32-
u = cent(cent, u, u, m);
31+
u = cnt(cnt, u, u, m);
3332
int sum = 0;
3433
auto it = partition(all(g[u]), [&](int v) {
3534
ll x = sum + siz[v];

0 commit comments

Comments
 (0)