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

东方博宜OJ 2191:树的重心(2)← 链式前向星 or 邻接表

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

【题目描述】
给定一棵树,树中有 n 个结点(编号 1~n)。请求出,删除该重心后,剩余子树的最多结点数?
重心定义:重心是指树中的一个结点,如果将这个点删除后,剩余各个连通块中点数的最大值最小,那么这个结点被称为树的重心。

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

【输出格式】
输出一个整数,代表删除重心后,剩余子树的最多结点。

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

【输出样例】
4

【数据范围】
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。

【算法代码一:链式前向星
本题代码与“AcWing 846:树的重心”相同。详见:https://blog.csdn.net/hnjzsyjyj/article/details/119912125

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

【算法代码二:邻接表

#include<bits/stdc++.h>
using namespace std;const int N=1e5+5;
vector<int> G[N];
bool st[N];
int imax=INT_MAX;
int n;int dfs(int u) {st[u]=true;int cnt=1;int rem=0; //remnantfor(auto i:G[u]) {if(!st[i]) {int t=dfs(i);rem=max(rem,t);cnt+=t;}}rem=max(rem,n-cnt);imax=min(rem,imax);return cnt;
}int main() {cin>>n;int x,y;for(int i=1; i<n; i++) {cin>>x>>y;G[x].push_back(y);G[y].push_back(x);}dfs(1);cout<<imax<<endl;return 0;
}/*
in:
9
1 2
1 7
1 4
2 8
2 5
4 3
3 9
4 6out:
4
*/




【参考文献】
https://blog.csdn.net/hnjzsyjyj/article/details/119912125
https://blog.csdn.net/hnjzsyjyj/article/details/155821553
 

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

相关文章:

  • 如何快速搭建企业级Bootstrap管理后台?5个实用技巧让你事半功倍
  • 2025新疆水泵哪家好?这份新疆污水泵厂家指南帮你避坑 - 栗子测评
  • Wayback Machine浏览器扩展终极指南:如何轻松回溯网页历史
  • WarcraftHelper终极指南:彻底解锁魔兽争霸III的现代化潜能
  • 28、深入了解 fwknop:配置、数据包格式与部署实践
  • 教育场景 Prompt:DeepSeek 贴合课标生成教学方案的关键词设计法
  • 720亿参数重构AI效率边界:盘古Pro MoE如何开启大模型工业化时代
  • 5步构建智能Agent:fast-agent框架完整实践指南
  • TscanCode静态代码扫描工具终极指南:快速上手与深度应用
  • 29、深入了解fwknop:功能、应用与安全防护
  • LiteLoaderQQNT插件安装终极指南:3分钟实现QQNT功能扩展
  • Wan2.2-T2V-A14B在潮汐能发电原理展示中的海水动能转化
  • Wan2.2-T2V-A14B模型轻量化版本正在开发中?官方透露进展
  • Markdown邮件工具终极指南:从入门到精通
  • 2025年靠谱的花岗岩地铺石厂家推荐及采购参考 - 行业平台推荐
  • MoeKoe Music完全攻略:免费解锁酷狗音乐全功能的终极方案
  • 还在为毕业论文发愁找不到免费工具?8款含真实参考文献工具轻松搞定! - 麟书学长
  • 2025年质量好的花岗岩庭院/花岗岩水景优质厂商精选榜(口碑优) - 行业平台推荐
  • Wan2.2-T2V-A14B如何处理多个角色交互场景?群戏生成挑战
  • JSON差异检测实战指南:从语法对比到语义分析的专业解决方案
  • 用Wan2.2-T2V-A14B打造高端广告生成平台的完整路径
  • 双引擎驱动语音智能新纪元:Step-Audio Tokenizer重塑2025人机交互标准
  • 如何快速掌握Obsidian图像工具包:图片浏览与编辑的完整指南
  • DeepSeek-Prover-V2震撼发布:671B参数刷新数学定理证明纪录,88.9%通过率改写AI推理边界
  • 阿里Qwen3-Omni全模态大模型:重构人机交互的技术革命与产业价值
  • 第一个agent
  • PyTorch Chamfer Distance:3D点云处理的革命性距离计算方案
  • ComfyUI-MultiGPU分布式显存优化技术深度解析
  • 股票历历史分时KDJ数据之Python、Java等多种主流语言实例代码演示通过股票数据接口
  • TTPLA数据集:电力设施智能检测的航拍图像解决方案