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

[C++][算法基础]树的重心(树图DFS)

给定一颗树,树中包含 n 个结点(编号 1∼n)和 n−1 条无向边。

请你找到树的重心,并输出将重心删除后,剩余各个连通块中点数的最大值。

重心定义:重心是指树中的一个结点,如果将这个点删除后,剩余各个连通块中点数的最大值最小,那么这个节点被称为树的重心。

输入格式

第一行包含整数 n,表示树的结点数。

接下来 n−1 行,每行包含两个整数 a 和 b,表示点 a 和点 b 之间存在一条边。

输出格式

输出一个整数 m,表示将重心删除后,剩余各个连通块中点数的最大值。

数据范围

1≤n≤10^{5}

输入样例
9
1 2
1 7
1 4
2 8
2 5
4 3
3 9
4 6
输出样例:
4

代码:

#include<iostream>
#include<vector>
#include<algorithm>
#include<cstring>
using namespace std;const int N = 100010;
int StartNode[N],edgeTo[N*2],NextThisNode[N*2];
int idx,n,ans;
int att[N*2];void add(int a,int b){edgeTo[idx] = b;NextThisNode[idx] = StartNode[a];StartNode[a] = idx;idx ++;
}int dfs(int x){att[x] = 1;int sum = 1;int res = 0;for(int i = StartNode[x];i != -1;i = NextThisNode[i]){int j = edgeTo[i];if(att[j] == 0){int temp = dfs(j);res = max(res,temp);sum += temp;}}res = max(n - sum,res);ans = min(res,ans);return sum;
}int main(){int a,b;cin>>n;ans = n;memset(StartNode,-1,sizeof StartNode);for(int i = 0;i < n;i++){cin>>a>>b;add(a,b);add(b,a);}dfs(1);cout<<ans<<endl;return 0;
}

 

http://www.lryc.cn/news/336854.html

相关文章:

  • 探秘ChatGPT:如何利用AI提升论文写作效率
  • 多无人机集群协同避障
  • 基于velero和minio实现k8s数据的备份
  • 【Java核心技术】第4章 对象与类
  • 【LeetCode】回溯算法类题目详解
  • java实现请求缓冲合并
  • 分布式锁的原子性问题
  • 从零自制docker-8-【构建实现run命令的容器】
  • 2024.03.31 校招 实习 内推 面经
  • 邦芒职场:塑造职场人气王的秘诀
  • 滤波器网络变压器的作用
  • Python —— 简述
  • 使用Rust加速Python程序,让代码飞起来
  • 【RISC-V 指令集】RISC-V 向量V扩展指令集介绍(八)- 向量整数算术指令
  • Qt Designer在布局中调整控件垂直伸展或者水平伸展之后控件没有变化
  • 微信公众号粉丝迁移费用是多少?
  • 基于Vue3 中后台管理系统框架
  • Agent调研--19类Agent框架对比
  • 蓝桥杯-求阶乘
  • 计算两个日期之间相差的天数的四种方法
  • 【leetcode面试经典150题】42. 有效的字母异位词(C++)
  • Windows 2003 R2与Windows 2022建立域信任报错:本地安全机构无法跟域控制器获得RPC连接。请检查名称是否可以解析,服务器是否可用。
  • UE5、CesiumForUnreal实现加载建筑轮廓GeoJson数据生成白模功能
  • JavaGUI编程
  • Nginx 基础应用实战 03 基于反向代理的负载均衡、https配置
  • [图解]DDD领域驱动设计伪创新-聚合根02
  • 《QT实用小工具·二十》存款/贷款计算器
  • hbase基础shell用法
  • ElasticSearch 的 BoolQueryBuilder 使用
  • [C++/Linux] 网络I/O处理