|
2 | 2 | #include "../../library/trees/centroid_decomp.hpp" |
3 | 3 | void cd_asserts(const vector<vector<int>>& adj) { |
4 | 4 | vector<int> decomp_size(sz(adj), -1); |
| 5 | + vector<int> naive_par_decomp(sz(adj), -1); |
5 | 6 | centroid(adj, |
6 | | - [&](const vector<vector<int>>& cd_adj, int cent, |
7 | | - int par_cent) -> void { |
8 | | - assert(decomp_size[cent] == -1); |
9 | | - auto dfs = [&](auto&& self, int u, int p) -> int { |
10 | | - int sub_size = 1; |
11 | | - for (int v : cd_adj[u]) |
12 | | - if (v != p) sub_size += self(self, v, u); |
13 | | - return sub_size; |
14 | | - }; |
15 | | - decomp_size[cent] = dfs(dfs, cent, -1); |
16 | | - if (par_cent != -1) |
17 | | - assert(1 <= decomp_size[cent] && |
18 | | - 2 * decomp_size[cent] <= decomp_size[par_cent]); |
19 | | - for (int u : cd_adj[cent]) { |
20 | | - int sz_subtree = dfs(dfs, u, cent); |
21 | | - assert(1 <= sz_subtree && |
22 | | - 2 * sz_subtree <= decomp_size[cent]); |
23 | | - } |
24 | | - }); |
| 7 | + [&](const vector<vector<int>>& cd_adj, int cent, |
| 8 | + int par_cent) -> void { |
| 9 | + assert(naive_par_decomp[cent] == par_cent); |
| 10 | + assert(decomp_size[cent] == -1); |
| 11 | + auto dfs = [&](auto&& self, int u, int p) -> int { |
| 12 | + naive_par_decomp[u] = cent; |
| 13 | + int sub_size = 1; |
| 14 | + for (int v : cd_adj[u]) |
| 15 | + if (v != p) sub_size += self(self, v, u); |
| 16 | + return sub_size; |
| 17 | + }; |
| 18 | + decomp_size[cent] = dfs(dfs, cent, -1); |
| 19 | + if (par_cent != -1) |
| 20 | + assert(1 <= decomp_size[cent] && |
| 21 | + 2 * decomp_size[cent] <= decomp_size[par_cent]); |
| 22 | + for (int u : cd_adj[cent]) { |
| 23 | + int sz_subtree = dfs(dfs, u, cent); |
| 24 | + assert(1 <= sz_subtree && |
| 25 | + 2 * sz_subtree <= decomp_size[cent]); |
| 26 | + } |
| 27 | + }); |
25 | 28 | rep(i, 0, sz(adj)) assert(decomp_size[i] >= 1); |
26 | 29 | } |
0 commit comments