Skip to Content
Team NoteAlgorithmCentroid Decomposition

Centroid Decomposition

struct centroid { int N; vi tree_size, vis, par; vvi _edges, edges; centroid(int N) : N(N), tree_size(N), vis(N), _edges(N), edges(N), par(N) {} void add_edge(int u, int v) { _edges[u].pb(v); } int get_size(int cur, int p) { tree_size[cur] = 1; for (int to: _edges[cur])if (to != p && !vis[to])tree_size[cur] += get_size(to, cur); return tree_size[cur]; } int get_centroid(int cur, int p, int cap) { for (int to: _edges[cur]) if (to != p && !vis[to] && tree_size[to] * 2 > cap) return get_centroid(to, cur, cap); return cur; } int build_tree(int cur, int p = -1) { cur = get_centroid(cur, -1, get_size(cur, -1)); par[cur] = p, vis[cur] = 1; for (int to: _edges[cur])if (!vis[to]) to = build_tree(to, cur), edges[cur].pb(to), edges[to].pb(cur); return cur; } };
Last updated on