树的重心

简介: 笔记

树的重心


定义

树的重心定义为树的某个节点,当去掉该节点后,树的各个连通分量中,节点数最多的连通分量其节点数达到最小值。树可能存在多个重心。


性质

5.png

2.树中所有节点到重心的距离之和最小,如果有两个重心,那么他们距离之和相等。

3.两个树通过一条边合并,新的重心在原树的两个重心的路径上

4.树删除或者添加一个叶子节点,重心最多只移动一条边

5.一棵树最多有两个重心,且相邻


求树的重心

#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
const int N = 1e5+10;
vector<int>vec[N];
int vis[N];
int n;
int ans = 0x3f3f3f3f;
int dfs(int now){ 
    vis[now] = 1;
    int sum = 1, res = 0;
    for(int i = 0;i<vec[now].size();++i){
        if(!vis[vec[now][i]]){
            int s = dfs(vec[now][i]); //以 now 的子节点为根的子树的大小
            res = max(res,s); // 连通分量最大值
            sum += s; //sum == 以 now 为根的所有子树中的节点数量
        }
    }
    res = max(n - sum,res); //以 now 的父亲节点为根且不包含 now 的子树的的大小 也即将 now 删除后 另一半子树的大小
    ans = min(ans,res); //连通分量最大值的最小值 即重心
    return sum;
}
int main(){ //建树
    cin >> n ;
    for(int i = 0;i<n-1;++i){
        int u,v;
        cin >> u >> v;
        vec[u].push_back(v);
        vec[v].push_back(u);
    }
    dfs(1);
    cout << ans << endl;
}


目录
相关文章
|
数据采集
JSoup 爬虫遇到的 404 错误解决方案
JSoup 爬虫遇到的 404 错误解决方案
|
传感器 人工智能 物联网
【C 言专栏】C 语言与硬件交互的方法
【5月更文挑战第4天】C 语言在硬件交互中扮演关键角色,主要通过直接访问硬件寄存器、中断处理、I/O 端口操作、内存映射I/O和设备驱动程序开发。挑战包括硬件多样性、实时性要求和错误处理。随着物联网和人工智能发展,C语言与硬件交互的需求增加,未来将面临更多新硬件和技术的挑战。本文旨在帮助读者理解和掌握这一领域的知识,以实现更高效的硬件互动。
421 1
【C 言专栏】C 语言与硬件交互的方法
|
Java 微服务 Spring
Spring Cloud全解析:配置中心之解决configserver单点问题
但是如果该configserver挂掉了,那就无法获取最新的配置了,微服务就出现了configserver的单点问题,那么如何避免configserver单点呢?
207 1
|
算法
递归函数实现素数判断
该文介绍了素数判断的递归实现,尽管递归算法在判断素数上并不高效,时间复杂度和空间复杂度均为O(N),但作为学习和理解递归的一种方式,仍有其价值。文章强调在实际应用中应选择更高效的方法。递归思路基于试除法,对于大于1的整数,如果只能被1和自身整除,则为素数。递归函数通过不断试除2到根号下该数之间的数来判断,同时注意到偶数不是素数。文中给出了非递归和递归的试除法代码示例。
311 2
|
前端开发 Java UED
Java中的图形用户界面编程:Swing与JavaFX的比较与应用
Java中的图形用户界面编程:Swing与JavaFX的比较与应用
1394 0
|
Java 数据库连接 程序员
Android 性能优化: 什么是内存泄漏?如何在Android中避免内存泄漏?
Android 性能优化: 什么是内存泄漏?如何在Android中避免内存泄漏?
327 2
|
Oracle 关系型数据库
kettle开发篇-替换空值
kettle开发篇-替换空值
744 0
|
存储 网络协议 程序员
Git 入门指南:从新手到高手的完全指南
Git是一种强大的分布式版本控制系统,广泛应用于软件开发中。它的使用不仅可以帮助开发团队更好地管理代码,还可以提高团队协作效率和代码质量。随着软件开发的不断发展,版本控制成为了程序员必备的一项技能。
236 0
|
IDE Unix 编译器
MinGW与Clion下载安装及使用详解
MinGW与Clion下载安装及使用详解
MinGW与Clion下载安装及使用详解
|
Windows
Visual Studio 2019 界面开发额外开启控制台
界面开发时,开启控制台,用于打印调试输出
775 0
Visual Studio 2019 界面开发额外开启控制台