重心分解(Centroid Decomposition)
首先要找到树的中心,树的重心的定义是:删除该中心结点得到的最大子树的顶点数最少的顶点就是树的重心。运用dfs的方法很容易实现,代码为:
void get_hvy(int u, int fa){
siz[u] = 1, maxx[u] = 0;
for(int i = head[u]; i != -1; i = e[i].next){
int v = e[i].to;
if(v != fa && !vis[v]){
get_hvy(v, u);
siz[u] += siz[v];
maxx[u] = max(maxx[u], siz[v]);
}
}
maxx[u] = max(maxx[u], S-siz[u]);
if(!hvy || maxx[hvy] > maxx[u]) hvy = u;
}
对于 p o j 1741 poj1741 poj1741题
根据重心 s s s把树分解为若干子树,那么所要求的顶点对(计算树上顶点对的距离)则分为以下三类:
- 顶点 u , v u,v u,v属于同一子树的顶点对 ( u , v ) (u,v) (u,v)
- 顶点 u , v u,v u,v不属于同一子树的顶点对 (