| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 
 | int dep[maxn], son[maxn], sz[maxn], f[maxn]; void dfs(int u, int fa) {
 int Max = 0; sz[u] = 1;
 for (int i = head[u]; ~i; i = e[i].next) {
 int v = e[i].to; if (v == fa) continue;
 f[v] = u; dep[v] = dep[u] + 1;
 dfs(v, u); sz[u] += sz[v];
 if (sz[v] > Max) Max = sz[v], son[u] = v;
 }
 }
 
 int top[maxn], id[maxn], c2, bl[maxn];
 void dfs(int u, int fa, int topf) {
 top[u] = topf; id[u] = ++c2; bl[c2] = u;
 if (son[u]) dfs(son[u], u, topf);
 for (int i = head[u]; ~i; i = e[i].next) {
 int v = e[i].to; if (v == fa || v == son[u]) continue;
 dfs(v, u, v);
 }
 }
 
 |