Logo ryp 的博客

博客

树的重心与求法

...
ryp
2025-12-01 12:50:15
She's not square

本文章由 WyOJ Shojo 从洛谷专栏拉取,原发布时间为 2023-12-17 15:43:16

重心的定义与性质

一棵树的重心是这样的点:将它删除后,它的所有子树的节点数量的最大值,在所有节点中最小。

重心最重要的性质是:一棵树上所有点到重心的距离和是最短的。

重心的求法

我们可以用一个简单的 DFS 算法来求重心。

对每一个节点,我们在 DFS 中统计它的子树节点数量,并且取得其最大值 $t$。我们知道,将这个节点删除后,整个图中除了它的子树,还有它的父亲所在的子树。它父亲所在的子树的节点数量,很明显是树的总节点数量减去这个节点的子树节点数量,也就是 $n - t$。

设 $p = \max (n - t, t)$,则我们只需要找到使 $p$ 最小的节点即可。

int
centroid (int p, int father)
{
  int weight = 0;
  sizep[p] = 1;

  for (auto t : e[p])
      if (t != father) weight = max (weight, sizep[p] += centroid (t, p););

  weight = max (weight, n - sizep[p]);
  if (weight < mw) mw = weight, center = p;
  return sizep[p];
}

center 就是重心。

评论

暂无评论

发表评论

可以用@mike来提到mike这个用户,mike会被高亮显示。如果你真的想打“@”这个字符,请用“@@”。