树的重心

树的重心

定义:
重心是指树中的一个结点,如果将这个点删除后,剩余各个连通块中点数的最大值最小,那么这个节点被称为树的重心。
不妨设max_part(x)为在删除节点x后产生的子树中,最大的一颗大小。那么树的重心就是使得max_part函数取到最小的节点p就是整颗树的重心。

void dfs(int x)
{
    v[x] = 1; size[x] = 1; //设置子树的大小;
    int max_part = 0; //表示删除x后最大子树的大小;
    
    for (int i = head[x]; i; i = ne[i]) 
    {
        int y= ver[i];
        if (v[y]) continue;  //点y已经被访问过了;
        dfs(y);
        size[x] += size[y]; //从子节点更新到父节点
        max_part = max(max_part, size[y]);
    }
    max_part = max(max_part, n - size[x]);
    if (max_part < ans ) {
        ans = max_part; //全局量记录重心对应的max_part
        pos = x;  //全局量pos记录重心;
    }
}

图里联通块计数

本质上还是图着色,这里用cnt表示不同的颜色。

void dfs(int x)
{
    v[x] = cnt;
    for (int i = head[x]; i; i = ne[i]) {
        int y = ver[i];
        if (v[y]) continue;
        dfs(y);
    }
}

//依次着色森林;
for (int i = 1; i <= n; i++) {
    if (!v[i]) {
        cnt++;
        dfs(i);
    }
}

参考

  1. 算法进阶指南
  2. ACwing
posted @   zhanghanLeo  阅读(63)  评论(0编辑  收藏  举报
编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
点击右上角即可分享
微信分享提示