树的重心

简介: 笔记

树的重心


定义

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


性质

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;
}


目录
相关文章
|
存储 算法 C++
一篇文章教会你什么是高度平衡二叉搜索(AVL)树(上)
AVL树的概念 AVL树(Adelson-Velsky and Landis Tree)是计算机科学中最早被发明的自平衡二叉查找树。在AVL树中,任一节点对应的两棵子树的最大高度差为1,因此
|
5月前
|
算法 测试技术 C++
【C++高阶】掌握AVL树:构建与维护平衡二叉搜索树的艺术
【C++高阶】掌握AVL树:构建与维护平衡二叉搜索树的艺术
42 2
|
7月前
|
存储 C++
【C++练级之路】【Lv.15】AVL树(双子旋转,领略绝对平衡之美)
【C++练级之路】【Lv.15】AVL树(双子旋转,领略绝对平衡之美)
【C++练级之路】【Lv.15】AVL树(双子旋转,领略绝对平衡之美)
|
7月前
|
存储 算法 关系型数据库
【面试普通人VS高手系列】b树和b+树的理解
【面试普通人VS高手系列】b树和b+树的理解
|
存储 测试技术
一篇文章教会你什么是高度平衡二叉搜索(AVL)树(下)
3.3 新节点插入较高左子树的右侧—左右:先左单旋再右单旋
|
存储 关系型数据库 MySQL
浅浅谈一谈B树和B+树
浅浅谈一谈B树和B+树
|
数据库 索引
树的进化
树的进化
88 0
|
算法 机器人
<<算法很美>>——(四)——深入递归<一>——自上而下,自下而上
<<算法很美>>——(四)——深入递归<一>——自上而下,自下而上
<<算法很美>>——(四)——深入递归<一>——自上而下,自下而上
图解!10张图揭秘树和森林!
图解!10张图揭秘树和森林!
图解!10张图揭秘树和森林!