关于找树的重心

P3806 【模板】点分治 1

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];
} 

这样找的重心肯定应该是没问题的, 这一部分多出来的时间复杂度应该也仅是 O(n)

7 跑了 24ms


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 求重心只是淀粉质的最简单的一部分,但是看到之前有很多人讨论这个,就发了个简简单单的补充


|