Skip to content

Commit 08bbf9a

Browse files
committed
add par array
1 parent 0008b5d commit 08bbf9a

File tree

1 file changed

+10
-9
lines changed

1 file changed

+10
-9
lines changed

library/trees/centroid_decomp.hpp

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -9,21 +9,21 @@
99
template<class F> struct centroid {
1010
vector<vi> adj;
1111
F f;
12-
vi sub_sz;
12+
vi siz, par;
1313
centroid(const vector<vi>& a_adj, F a_f):
14-
adj(a_adj), f(a_f), sub_sz(sz(adj), -1) {
15-
rep(i, 0, sz(adj)) if (sub_sz[i] == -1) dfs(i);
14+
adj(a_adj), f(a_f), siz(sz(adj), -1), par(siz) {
15+
rep(i, 0, sz(adj)) if (siz[i] == -1) dfs(i);
1616
}
1717
void calc_sz(int v, int p) {
18-
sub_sz[v] = 1;
18+
siz[v] = 1;
1919
for (int u : adj[v])
20-
if (u != p) calc_sz(u, v), sub_sz[v] += sub_sz[u];
20+
if (u != p) calc_sz(u, v), siz[v] += siz[u];
2121
}
22-
void dfs(int v) {
22+
int dfs(int v) {
2323
calc_sz(v, -1);
24-
for (int p = -1, sz_root = sub_sz[v];;) {
24+
for (int p = -1, sz_root = siz[v];;) {
2525
auto big_ch = find_if(all(adj[v]), [&](int u) {
26-
return u != p && 2 * sub_sz[u] > sz_root;
26+
return u != p && 2 * siz[u] > sz_root;
2727
});
2828
if (big_ch == end(adj[v])) break;
2929
p = v, v = *big_ch;
@@ -32,7 +32,8 @@ template<class F> struct centroid {
3232
for (int u : adj[v]) {
3333
iter_swap(find(all(adj[u]), v), rbegin(adj[u]));
3434
adj[u].pop_back();
35-
dfs(u);
35+
par[dfs(u)] = v;
3636
}
37+
return v;
3738
}
3839
};

0 commit comments

Comments
 (0)