|
|
|
@ -21,23 +21,15 @@ void dfs(int u, int fa) {
|
|
|
|
|
for (int i = h[u]; ~i; i = ne[i]) { // 枚举u的每一条出边
|
|
|
|
|
int v = e[i];
|
|
|
|
|
if (v == fa) continue;
|
|
|
|
|
dfs(v, u);
|
|
|
|
|
sz[u] += sz[v];
|
|
|
|
|
dfs(v, u); // 先把v为根的子树遍历完
|
|
|
|
|
sz[u] += sz[v]; // 把 v中获取填充的sz[v]值,用于组装自己sz[u]
|
|
|
|
|
son[u] = max(son[u], sz[v]);
|
|
|
|
|
}
|
|
|
|
|
son[u] = max(son[u], n - sz[u]);
|
|
|
|
|
if ((son[u] << 1) <= n) r2 = r1, r1 = u;
|
|
|
|
|
}
|
|
|
|
|
/*
|
|
|
|
|
1 2
|
|
|
|
|
1 2
|
|
|
|
|
1 3
|
|
|
|
|
2 3
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
signed main() {
|
|
|
|
|
#ifndef ONLINE_JUDGE
|
|
|
|
|
freopen("CF1406C.in", "r", stdin);
|
|
|
|
|
#endif
|
|
|
|
|
int T;
|
|
|
|
|
cin >> T;
|
|
|
|
|
while (T--) {
|
|
|
|
|