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

算法板子:树形DP、树的DFS——树的重心

思想:

在这里插入图片描述

代码:

#include <iostream>
#include <cstring>
using namespace std;const int N = 1e5 + 10;// vis标记当前节点是否被访问过; vis[1]=true代表编号为1的节点被访问过
bool vis[N];
// h数组为邻接表; h数组上的每个坑位都串了一个单链表; h[1]=3代表编号为1的节点的第一个邻接节点的编号为3
// e[i]代表编号为i的节点的值; ne[i]代表编号为i的节点的下一个节点的编号; idx代表当前可用编号; 注意这里的e和ne数组要开2*N的大小
int h[N], e[2 * N], ne[2 * N], idx;// res存储去掉各个节点后的最大连通块的最小值; 初始记录为最大值,最大值为最大连通块的点数,就是树中所有的节点数
int n, res = N;// 值为a的节点和值为b的节点之间存在一条边,在以a打头的单链表上插入头结点b
void add(int a, int b)
{e[idx] = b, ne[idx] = h[a], h[a] = idx ++ ;
}// 得到以u为根的树的总节点数
int dfs(int u)
{vis[u] = true; // 标记u节点已经访问过int size = 0; // 代表以u为根的最大子树的节点数; 初始时最大子树节点数为0int sum = 1; // 代表以u为根的树的总节点数; 初始时该树的总节点数为1// 遍历u节点的邻居; 也就是遍历u的每个儿子for (int i = h[u]; i != -1; i = ne[i]){int j = e[i]; // 得到u节点的邻居节点,也就是u的儿子if (vis[j]) continue; //避免叶子结点找到的邻居节点为父节点int s = dfs(j); // 得到以某个儿子节点为根的树的总节点数; 也就是某个子树的节点数size = max(size, s); // 更新最大子树节点数sum += s; // 累加所有子树的节点数}// 如果删掉了u这个点,那么整个树可以分成两部分,u的所有子树和u的上面的剩余部分// u的所有子树的最大节点数为size,剩余部分为整棵树的总节点数减去以u为根的树的节点数,求max后得到删去u后连通块中的最大节点数// 再和删去其他节点的答案作比较,更新最小的最大连通块的点数res = min(res, max(size, n - sum));return sum;
}int main()
{cin >> n;// 首先要初始化邻接表hmemset(h, -1, sizeof h);// 将输入的点构成邻接表for (int i = 0; i < n - 1; i ++ ){int a, b;cin >> a >> b;// 比如a=1 b=3,代表值为1的节点和值为3的节点之间存在边; 那么1的单链表后面要串个3,3的单链表后面要串个1add(a, b); add(b, a);}// 从树中的任意一个节点开始dfs都可以; 比如也可以是dfs(n-1)dfs(1);cout << res << endl;return 0;
}

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 除湿机的标准
  • 深入探究CSRF与SSRF漏洞复现:从原理到实践
  • 智能驾驶学习笔记,第一天
  • opencascade AIS_ViewCube源码学习小方块
  • Linux中栈的大小的修改
  • vue3+element-plus实现table表格整列的拖拽
  • 函数对象/仿函数
  • 【机器学习】逻辑回归的梯度下降以及在一变量数据集、两变量数据集下探索优化的梯度下降算法
  • 26.9 Django书籍管理练习
  • vue实现简易的全局加载动画效果
  • 2.回文数
  • Python使用内置logging模块打印日志
  • 主动学习实现领域自适应语义分割
  • 某次活动优惠券故障复盘及优化建议
  • JVM生态创新
  • ES6指北【2】—— 箭头函数
  • 【跃迁之路】【585天】程序员高效学习方法论探索系列(实验阶段342-2018.09.13)...
  • Docker 1.12实践:Docker Service、Stack与分布式应用捆绑包
  • JavaScript 基础知识 - 入门篇(一)
  • javascript面向对象之创建对象
  • Lsb图片隐写
  • Octave 入门
  • open-falcon 开发笔记(一):从零开始搭建虚拟服务器和监测环境
  • overflow: hidden IE7无效
  • PermissionScope Swift4 兼容问题
  • text-decoration与color属性
  • tweak 支持第三方库
  • 初识MongoDB分片
  • 利用阿里云 OSS 搭建私有 Docker 仓库
  • 目录与文件属性:编写ls
  • 微服务入门【系列视频课程】
  • 一道闭包题引发的思考
  • ionic异常记录
  • ​2021半年盘点,不想你错过的重磅新书
  • #pragma multi_compile #pragma shader_feature
  • (1)无线电失控保护(二)
  • (9)STL算法之逆转旋转
  • (分布式缓存)Redis持久化
  • (十三)Java springcloud B2B2C o2o多用户商城 springcloud架构 - SSO单点登录之OAuth2.0 根据token获取用户信息(4)...
  • (转)chrome浏览器收藏夹(书签)的导出与导入
  • (转)编辑寄语:因为爱心,所以美丽
  • .NET4.0并行计算技术基础(1)
  • .NETCORE 开发登录接口MFA谷歌多因子身份验证
  • .net实现头像缩放截取功能 -----转载自accp教程网
  • .net通用权限框架B/S (三)--MODEL层(2)
  • /bin/rm: 参数列表过长"的解决办法
  • /etc/X11/xorg.conf 文件被误改后进不了图形化界面
  • [BZOJ4554][TJOI2016HEOI2016]游戏(匈牙利)
  • [C#]无法获取源 https://api.nuge t.org/v3-index存储签名信息解决方法
  • [CP_AUTOSAR]_分层软件架构_接口之通信模块交互介绍
  • [Excel] vlookup函数
  • [FTP]pureftp部署和优化
  • [Go WebSocket] 多房间的聊天室(三)自动清理无人房间
  • [hdu2196]Computer树的直径
  • [iOS开发]事件处理与响应者链