当前位置: 首页 > java >正文

[NOIP][C++] 树的重心

树的重心

定义

对于一个树,树的重心定义为:删掉某点 i 后,若剩余 k 个连通分量,那么定义 d(i) 为这些连通分量中点的个数的最大值,所谓重心,就是使得 d(i) 最小的点 i

基于以上定义,一个树的重心可能会有一个或者两个。

在这里插入图片描述
如图所示,这棵树无点权、无边权、无向。
假设我们删掉最上面的点,剩下的2个子树大小分别为5和3,那么取较大值d(i)=5
能够使 d(i) 最小的点,则为重心。

求法

dfs求重心代码:(C++)

#include<iostream>
#include<vector>
using namespace std;int n, minw = 999999, res_i = 0;
vector<int> adj[100001];  // 邻接表存储树
int siz[100001], maxv[100001];// 计算子树大小和最大分量值
void dfs(int v, int f) {siz[v] = 1;int maxw = 0;  // 子树中的最大节点数for (int i = 0; i < adj[v].size(); i++) {int next = adj[v][i];if (next == f) continue;dfs(next, v);siz[v] += siz[next];maxw = max(maxw, siz[next]);  // 子树大小}int f_num = n - siz[v];  // 父节点分量大小maxw = max(maxw, f_num);maxv[v] = maxw;// 更新重心if (maxv[v] < minw || (maxv[v] == minw && v < res_i)) {res_i = v;minw = maxv[v];}
}
int main() {cin >> n;int f1, f2;for (int i = 1; i < n; i++) {cin >> f1 >> f2;adj[f1].push_back(f2);  // 邻接表存边(双向)adj[f2].push_back(f1);}dfs(1, 0);cout << res_i << endl;return 0;
}

输入输出样例 #1

输入 #1

4
1 2 
2 3 
3 4

输出 #1

2
http://www.xdnf.cn/news/15527.html

相关文章:

  • Word 文档合并利器:基于 org.docx4j 的 Java 实现全解析
  • Java线程创建与运行全解析
  • GraphQL与REST在微服务接口设计中的对比分析与实践
  • Windows 启动后桌面黑屏,其他程序正常运行
  • Java接口:小白如何初步认识Java接口?
  • 一点点dd
  • WPF 加载和显示 GIF 图片的完整指南
  • 聚焦AI与物流核心技术:2025智慧物流论坛及长三角快递物流展会9月上海开幕
  • API Gateway HTTP API 控制客户端访问 IP 源
  • CSV 字段映射小工具 Demo
  • Thymeleaf 基础语法与标准表达式详解
  • 安全初级作业2
  • Linux LVS集群技术详解与实战指南
  • 测试工作中的质量门禁管理
  • HTML基础P1 | HTML基本元素
  • 【游戏引擎之路】登神长阶(十九):3D物理引擎——岁不寒,无以知松柏;事不难,无以知君子
  • 【uni-ui】hbuilderx的uniapp 配置 -小程序左滑出现删除等功能
  • Django+Celery 进阶:Celery可视化监控与排错
  • 健康生活,从细节开始
  • Linux运维常用命令大全
  • JS的防抖与节流
  • 实例操作:基于 PipeLine 实现 JAVA项目集成 SonarQube代码检测通知 Jenkins
  • 基于R、Python的Copula变量相关性分析
  • 开源 python 应用 开发(七)数据可视化
  • 网络编程/Java面试/TCPUDP区别
  • Spring Boot 解决跨域问题
  • langchain--1--agent示例
  • AWS权限异常实时告警系统完整实现指南
  • 动态规划题解——分割等和子集【LeetCode】
  • Spring Boot 缓存 与 Redis