每次找之前重新算一遍当前树的大小就行了吧,我是这么写的:
部分代码:
void dfs(int u,int fa) {
siz[u]=1;
int maxn=0;
for(int i=0; i<b[u].size(); i++) {
int v=b[u][i].to;
int id=b[u][i].id;
if(v==fa||vis[id]) continue;
dfs(v,u);
siz[u]+=siz[v];
if(siz[v]>maxn) maxn=siz[v];
}
maxn=max(maxn,sz-siz[u]);
if(maxn<minn) {
minn=maxn;
new_rt=u;
}
}
void get_size(int root) {
dfs(root,0);
sz=siz[root];
}
这样找的重心肯定应该是没问题的, 这一部分多出来的时间复杂度应该也仅是 O(n)
#7 跑了 24ms