99template <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