【概述】

树的重心也叫树的质心,对于一棵具有 n 个结点的无根树,找到一个点,使得将树变为以该点为根的有根树时,最大子树的结点数最小

简单来说,就是给定一棵 n 个点的树,当删除某点 x 后,使得最大连通块最小,此时点 x 即为树的重心。

相关性质:

  1. 一棵树最多有两个重心,且这两个重心相邻
  2. 一棵树添加或删除一个节点时,树的重心最多只移动一条边的位置
  3. 把两棵树通过一条边相连,新的树的重心在原来两棵树重心的连线上
  4. 树中所有点到某个点的距离和中,到重心的距离和是最小的,如果有两个距离和,他们的距离和一样

树的重心同样可以用 dfs 来求,设 size[i] 表示以 i 为根的子树的总大小,mson 表示以 i 为根的最大子树的大小,然后利用 dfs 维护这两个数组即可

最后只需要求所有的 max(n-size[x], mson[x]) 的最小值即为以 x 为根时最大子树的大小,其中 n-size[x] 代表删去 x 及其子树后的连通块大小

【实现】

struct Edge {int to, val;int next;Edge() {}Edge(int to, int val, int next) : to(to), val(val), next(next) {}
} edge[N];
int n;
int head[N], tot;
int size[N], mson[N];
int core, minBalance = INF;
void addEdge(int from, int to, int val) {edge[++tot].to = to;edge[tot].val = val;edge[tot].next = head[from];head[from] = tot;
}
void dfs(int x, int father) {size[x] = 1;mson[x] = 0;for (int i = head[x]; i != -1; i = edge[i].next) {int y = edge[i].to;if (y == father)continue;dfs(y, x);size[x] += size[y];mson[x] = max(mson[x], size[y]);}mson[x] = max(n - size[x], mson[x]);if (mson[x] < minBalance) {core = x;minBalance = mson[x];}
}
int main() {scanf("%d", &n);memset(head, -1, sizeof(head));for (int i = 1; i <= n - 1; i++) {int x, y, val;scanf("%d%d%d", &x, &y, &val);addEdge(x, y, val);addEdge(y, x, val);}dfs(1, 0);printf("%d %d\n", core, minBalance);return 0;
}

树形结构 —— 树与二叉树 —— 树的重心相关推荐

  1. 6.4 树和二叉树-树和森林

    树和二叉树-树和森林 1. 树和森林的表示方法 1.1 树的三种存储结构-`双亲`表示法 1.2 树的三种存储结构-`孩子链表`表示法 1.3 树的三种存储结构-`孩子兄弟(二叉链表)(二叉树)`表示 ...

  2. PHP算法 《树形结构》 之 伸展树(1) - 基本概念

    伸展树的介绍 1.出处:http://dongxicheng.org/structure/splay-tree/ A. 概述 二叉查找树(Binary Search Tree,也叫二叉排序树,即Bin ...

  3. 数据库树形结构,EasyUI Tree 树

    通过 $.fn.tree.defaults 重写默认的 defaults. 树(tree)在网页中以树形结构显示分层数据.它向用户提供展开.折叠.拖拽.编辑和异步加载功能. 树的数据格式(Tree D ...

  4. 树形结构 —— 树与二叉树 —— 树的中心

    [概述] 树的中心问题是指:当给出 n 个结点与 n-1 条边后,要选定一个点作为整棵树的根结点,使得从该点到每个叶结点的最长路径最短. 树的中心问题主要有两种方法:DFS/BFS 进行搜索.树形 D ...

  5. 树形结构 —— 树与二叉树 —— 树的直径

    [定义] 给定一棵树,树中的每条边都有一个权值. 树中两点的距离:连接两点的路径边权之和 树的直径:树中最远的两个节点之间的距离 树的最长链:连接树中最远的两个结点的路径 [实现] 树的直径通常有两种 ...

  6. 树形结构 —— 树与二叉树 —— 树的数据生成器

    为方便测试数据,给出一个树的数据生成器. 树的结点为 1~10 个,边权为 1~100,各点编号随机化 struct Edge {int x, y;int dis; } edge[N]; int n, ...

  7. 树形结构 —— 树与二叉树

    [概述] 树是一种非线性的.递归定义的有序数据结构,能很好地描述有分支和层次特性的数据集合. 二叉树是树的一种形态,是 n 个结点的有限集合,该集合或为空集(空二叉树),或由一个根结点与两棵互不相交的 ...

  8. 数据结构--树和二叉树

    文章目录 树和二叉树 树 1.树的定义 2.树的逻辑表示 3.树的基本术语: 4.树的性质 5.树的基本运算 二叉树 二叉树的存储结构 二叉树的遍历 树和二叉树 树 1.树的定义 2.树的逻辑表示 树 ...

  9. 数据结构与算法——树和二叉树***

    第五章 :树和二叉树 树和图是两种重要的非线性结构.线性结构中结点具有唯一前驱和唯一后继的关系,而非线性结构中结点之间的关系不再具有这种唯一性.其中,树形结构中结点间的关系是前驱唯一而后继不唯一,即元 ...

最新文章

  1. iOS plist文件
  2. codeforces 483B Friends and Presents
  3. fatal error C1083: Cannot open include file: 'ceconfig.h': No such file or directory
  4. Maven集成指令总结
  5. 分布式系统一致性协议--Paxos算法
  6. php session 为空,ThinkPHP_session问题_dump显示session为空
  7. Remove Duplicates from Sorted Array II
  8. Android P (2)---Android 9.0 “Pistachio Ice Cream”新功能和特性
  9. java中typeof_JS typeof的用法
  10. elasticsearch-analysis-ik-1.10.0中文分词插件安装
  11. 半波对称振子方向图_画好服装款式图的五个要点
  12. eval函数python_Python eval()函数
  13. js转php,js代码转php代码可行吗?
  14. week03_python标准库datetime
  15. 35岁了,依然倔强的相信未来!——我的2021年终总结
  16. 使用Xcode创建第一个App
  17. vue项目图标处理工具
  18. 教你如何使用u盘安装Linux系统,手把手教你如何使用u盘安装Linux系统
  19. 解决“网易邮箱提醒:一次被阻止的收信行为”
  20. win10运行在哪里打开 win10怎么打开运行窗口快捷键

热门文章

  1. 终于有人把数据湖讲明白了
  2. 终于有人把数据中台讲明白了
  3. 50种不同编程语言的“Hello, World”,你会写几种?
  4. java输入年月输出日历_java输入年份打印该年份的年历
  5. conda deactivate python3_conda进行python环境隔离
  6. 快速入门:使用 Docker 运行 SQL Server 容器映像
  7. 【高并发解决方案】5、如何设计一个秒杀系统
  8. JeeWx 微信开发公开课(Jeewx-API 专题),今晚8点不见不散
  9. 实践中整理出tomcat集群和负载均衡
  10. Java进阶 | IO流核心模块与基本原理