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

东方博宜OJ 2190:树的重心 ← 链式前向星

【题目来源】
https://oj.czos.cn/p/2190

【题目描述】
给定一颗树,树中有 n 个结点(编号1~n)。请你找到树的重心,并输出树的重心的结点编号。
重心定义:重心是指树中的一个结点,如果将这个点删除后,剩余各个连通块中结点数的最大值最小,那么这个结点被称为树的重心
如下图所示的树的重心为1号结点。

boyi2190

【输入格式】
第 1 行读入一个整数 n,代表树的结点的数量(1≤n≤10^5);
接下来 n-1 行,每行读入两个整数 x 和 y,表示结点 x 和 y 之间有一条边(注意:不确定 x 和 y 的父子关系)。

【输出格式】
请输出树的重心的结点编号,如果树有多个重心,请按照编号从小到大依次输出,数字之间用空格隔开。

【输入样例一】
6
1 2
1 3
2 4
3 5
5 6

【输出样例一】
1 3

【输入样例二】
8
1 2
1 3
2 4
3 5
5 6
5 7
5 8

【输出样例二】
3 5

【数据范围】
1≤n≤10^5​​​​​​​

【算法分析】
依据样例二,绘制树的示意图,然后依据定义分析“树的重心”过程如下。

boyi2190_star

删除结点 1,产生的两个连通块中结点数分别为 2、5,最大值为 5;
删除结点 2,产生的两个连通块中结点数分别为 1、6,最大值为 6;​​​​​​​
删除结点 3,产生的两个连通块中结点数分别为 3、4,最大值为 4
删除结点 4,产生的一个连通块中结点数分别为 7,最大值为 7;
删除结点 5,产生的四个连通块中结点数分别为 1、1、1、4,最大值为 4
删除结点 6,产生的一个连通块中结点数分别为 7,最大值为 7;
删除结点 7,产生的一个连通块中结点数分别为 7,最大值为 7;
删除结点 8,产生的一个连通块中结点数分别为 7,最大值为 7。
综上,可知 8 个最大值中的最小值为 4,但有两个。也就是说,给出的树有两个重心,分别为结点 3、结点 5。

【算法代码】

#include <bits/stdc++.h>
using namespace std;const int N=1e5+5;
const int M=N<<1;
int h[N],e[M],ne[M],idx;
int pre[N],cnt[N];
int rem[N]; //remnant
int n;void add(int a,int b) {e[idx]=b,ne[idx]=h[a],h[a]=idx++;
}int dfs(int u,int fa) {cnt[u]=1;pre[u]=fa;for(int i=h[u]; i!=-1; i=ne[i]) {int j=e[i];if(j!=fa) cnt[u]+=dfs(j,u);}return cnt[u];
}int main() {memset(h,-1,sizeof h);cin>>n;for(int i=1; i<n; i++) {int a,b;cin>>a>>b;add(a,b),add(b,a);}dfs(1,-1);int imin=INT_MAX;for(int u=1; u<=n; u++) {rem[u]=n-cnt[u];for(int i=h[u]; i!=-1; i=ne[i]) {int j=e[i];if(pre[j]==u) {rem[u]=max(rem[u],cnt[j]);}}imin=min(imin,rem[u]);}for(int i=1; i<=n; i++) {if(imin==rem[i]) cout<<i<<" ";}return 0;
}/*
in:
6
1 2
1 3
2 4
3 5
5 6out:
1 3
*/





【参考文献】
https://blog.csdn.net/hnjzsyjyj/article/details/119912125
https://blog.csdn.net/weixin_43810158/article/details/88391828
https://blog.csdn.net/weixin_73739312/article/details/129072527


 

http://www.jsqmd.com/news/73092/

相关文章:

  • 2025.12.11
  • 第五十二天
  • 阿里云国内服务器安装 node/npm/nvm 环境
  • Maximize Xtool D7 Performance: 1-Year Update Service for European/American Mechanics Owners
  • AI智能体核心技术揭秘与构建指南
  • LeeCode 热题100--移动零
  • 可溶性蛋白表达指南:原理、系统与策略解析
  • 函数模板与类模板——泛型编程
  • 03-事务高频面试总结 - 实践
  • bitset 解决高维偏序连边的 DAG 点权最短路问题
  • ROS2 常用工具包总览
  • RustFS MCP Server:构建下一代AI模型存储基础设施的实践指南
  • apache 怎么给同一个虚拟主机绑定多个端口
  • 北京有哪些好的陪诊品牌 - 品牌排行榜单
  • 基于CNN-BiLSTM的室内WiFi指纹定位办法研究
  • 基于BERT的数据库字段文本分类分级任务
  • 2025.12.11博客
  • 持久化与内存管理策略——RDB/AOF、淘汰策略与容量规划的决策要点
  • 61
  • day4 Java基础5
  • 2025.12.11 - 呓语
  • Ai元人文构想:嬉斗长天撩一线——皇帝的新装
  • 完整教程:制造业库存系统卡顿?金仓数据库平替MongoDB实现高效稳定管理
  • 北京有哪些回收名家字画的品牌 - 品牌排行榜单
  • 公约数距
  • AI Compass前沿速览:Open-AutoGLM智能体框架、Z-Image图像生成、GLM-4.6V多模态理解与可灵2.6音画同步技术
  • 极速AI助手如何使用免费的阿里云的大模型
  • Jetson Orin Nano super -4 系统( 固态硬盘)的备份与恢复
  • 北京有哪些回收老酒名酒茅台五粮液的品牌 - 品牌排行榜单
  • Markdown语法笔记