点分治

  点分治可以用来处理有关树上路径的问题

  首先选取当前子树的重心作为分治点,因为重心可保证最大的子树不超过(u/2),这样每次递归的处理下去,复杂度是(nlogn)的

  求重心代码:

void getroot(int u,int par){
    sz[u]=1,son[u]=0;
    for(int i=h[u];i!=-1;i=e[i].next){
        int v=e[i].to;
        if(vis[v] || v==par) continue;
        getroot(v,u);
        sz[u]+=sz[v];
        son[u]=max(son[u],sz[v]); 
    }
    son[u]=max(son[u],sum-sz[u]);
    if(son[u]<maxson){
        maxson=son[u];
        rt=u;
    }
}
View Code

相关文章:

  • 2021-08-05
  • 2021-04-16
  • 2021-09-05
  • 2021-07-02
  • 2022-02-28
  • 2022-01-24
  • 2021-09-20
猜你喜欢
  • 2021-05-23
  • 2022-12-23
  • 2022-01-12
  • 2022-12-23
  • 2021-11-07
  • 2021-08-17
  • 2021-09-27
相关资源
相似解决方案