树的重心为f[i]最小的点
// 树的重心:最大子树的结点数最小
// f[i]:以i为根的最大子树的结点数
// size[i]:以i为根的子树的结点数
int f[maxn],size[maxn],all;
vector<int> ve[maxn];
void dfs(int u,int fa){
size[u]=1;
for(int v:ve[u]){
if(v==fa) continue;
dfs(v,u);
size[u]+=size[v];
f[u]=max(f[u],size[v]);
}
f[u]=max(f[u],all-size[u]);
}