rfsfreffr @ 2022-08-16 12:27:01
每次找之前重新算一遍当前树的大小就行了吧,我是这么写的:
部分代码:
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];
}
这样找的重心肯定应该是没问题的, 这一部分多出来的时间复杂度应该也仅是
by Infinite_Energy @ 2022-08-16 12:43:50
讨论区禁止发题解,若有疑问请明确指出。
by anonymous_letter @ 2022-08-16 12:45:58
@x123s456j789 这不能叫题解吧,这应该只是好心的提示,而且点分治中找重心只是一小步
by Infinite_Energy @ 2022-08-16 12:47:25
行行行
by rfsfreffr @ 2022-08-17 17:42:47
@x123s456j789 求重心只是淀粉质的最简单的一部分,但是看到之前有很多人讨论这个,就发了个简简单单的补充