树形结构 —— 树与二叉树 —— 树的重心
【概述】
树的重心也叫树的质心,对于一棵具有 n 个结点的无根树,找到一个点,使得将树变为以该点为根的有根树时,最大子树的结点数最小。
简单来说,就是给定一棵 n 个点的树,当删除某点 x 后,使得最大连通块最小,此时点 x 即为树的重心。
相关性质:
- 一棵树最多有两个重心,且这两个重心相邻
- 一棵树添加或删除一个节点时,树的重心最多只移动一条边的位置
- 把两棵树通过一条边相连,新的树的重心在原来两棵树重心的连线上
- 树中所有点到某个点的距离和中,到重心的距离和是最小的,如果有两个距离和,他们的距离和一样
树的重心同样可以用 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;
}
树形结构 —— 树与二叉树 —— 树的重心相关推荐
- 6.4 树和二叉树-树和森林
树和二叉树-树和森林 1. 树和森林的表示方法 1.1 树的三种存储结构-`双亲`表示法 1.2 树的三种存储结构-`孩子链表`表示法 1.3 树的三种存储结构-`孩子兄弟(二叉链表)(二叉树)`表示 ...
- PHP算法 《树形结构》 之 伸展树(1) - 基本概念
伸展树的介绍 1.出处:http://dongxicheng.org/structure/splay-tree/ A. 概述 二叉查找树(Binary Search Tree,也叫二叉排序树,即Bin ...
- 数据库树形结构,EasyUI Tree 树
通过 $.fn.tree.defaults 重写默认的 defaults. 树(tree)在网页中以树形结构显示分层数据.它向用户提供展开.折叠.拖拽.编辑和异步加载功能. 树的数据格式(Tree D ...
- 树形结构 —— 树与二叉树 —— 树的中心
[概述] 树的中心问题是指:当给出 n 个结点与 n-1 条边后,要选定一个点作为整棵树的根结点,使得从该点到每个叶结点的最长路径最短. 树的中心问题主要有两种方法:DFS/BFS 进行搜索.树形 D ...
- 树形结构 —— 树与二叉树 —— 树的直径
[定义] 给定一棵树,树中的每条边都有一个权值. 树中两点的距离:连接两点的路径边权之和 树的直径:树中最远的两个节点之间的距离 树的最长链:连接树中最远的两个结点的路径 [实现] 树的直径通常有两种 ...
- 树形结构 —— 树与二叉树 —— 树的数据生成器
为方便测试数据,给出一个树的数据生成器. 树的结点为 1~10 个,边权为 1~100,各点编号随机化 struct Edge {int x, y;int dis; } edge[N]; int n, ...
- 树形结构 —— 树与二叉树
[概述] 树是一种非线性的.递归定义的有序数据结构,能很好地描述有分支和层次特性的数据集合. 二叉树是树的一种形态,是 n 个结点的有限集合,该集合或为空集(空二叉树),或由一个根结点与两棵互不相交的 ...
- 数据结构--树和二叉树
文章目录 树和二叉树 树 1.树的定义 2.树的逻辑表示 3.树的基本术语: 4.树的性质 5.树的基本运算 二叉树 二叉树的存储结构 二叉树的遍历 树和二叉树 树 1.树的定义 2.树的逻辑表示 树 ...
- 数据结构与算法——树和二叉树***
第五章 :树和二叉树 树和图是两种重要的非线性结构.线性结构中结点具有唯一前驱和唯一后继的关系,而非线性结构中结点之间的关系不再具有这种唯一性.其中,树形结构中结点间的关系是前驱唯一而后继不唯一,即元 ...
最新文章
- iOS plist文件
- codeforces 483B Friends and Presents
- fatal error C1083: Cannot open include file: 'ceconfig.h': No such file or directory
- Maven集成指令总结
- 分布式系统一致性协议--Paxos算法
- php session 为空,ThinkPHP_session问题_dump显示session为空
- Remove Duplicates from Sorted Array II
- Android P (2)---Android 9.0 “Pistachio Ice Cream”新功能和特性
- java中typeof_JS typeof的用法
- elasticsearch-analysis-ik-1.10.0中文分词插件安装
- 半波对称振子方向图_画好服装款式图的五个要点
- eval函数python_Python eval()函数
- js转php,js代码转php代码可行吗?
- week03_python标准库datetime
- 35岁了,依然倔强的相信未来!——我的2021年终总结
- 使用Xcode创建第一个App
- vue项目图标处理工具
- 教你如何使用u盘安装Linux系统,手把手教你如何使用u盘安装Linux系统
- 解决“网易邮箱提醒:一次被阻止的收信行为”
- win10运行在哪里打开 win10怎么打开运行窗口快捷键
热门文章
- 终于有人把数据湖讲明白了
- 终于有人把数据中台讲明白了
- 50种不同编程语言的“Hello, World”,你会写几种?
- java输入年月输出日历_java输入年份打印该年份的年历
- conda deactivate python3_conda进行python环境隔离
- 快速入门:使用 Docker 运行 SQL Server 容器映像
- 【高并发解决方案】5、如何设计一个秒杀系统
- JeeWx 微信开发公开课(Jeewx-API 专题),今晚8点不见不散
- 实践中整理出tomcat集群和负载均衡
- Java进阶 | IO流核心模块与基本原理