点分治
点分治可以用来处理有关树上路径的问题
首先选取当前子树的重心作为分治点,因为重心可保证最大的子树不超过(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; } }