C++ dfs 与图有关的知识(四十七)【第七篇】

今天我们接着来学习树上搜索(dfs深度优先搜索)

1.树的深度与子树大小

树的深度:规定根结点是树的第一层,树根的孩子结点是树的第二层,以此类推,树的深度就是结点的最大层数。

根据定义,如果我们已经知道树中某个结点 u 的深度 dep[u],那么结点 
u 的儿子结点 
v 的深度 dep[v]=dep[u]+1。

图片

求解每个结点的深度:自上而下。

int dep[110];
void dfs(int u, int fa) {dep[u] = dep[fa] + 1;for (int i = 0; i < G[u].size(); i++) {int v = G[u][i];if (v != fa) {dfs(v, u);}}
}

在树上有一个很重要的概念是子树,子树就是包括当前节点和它底下所有节点的一棵树。

比如

图片

如果以 
1 为根,那么以 2 号结点为根的子树就包括 2,4,6 三个点,这棵子树大小就是 3 。

这一节我们就来求解以每个点为根的子树的大小。

解决子树问题,往往是把一棵子树拆成子树的根和底下的很多棵小的子树。

图片

比如这里,如果 
1 是整棵树的根,那么以 2 为根的子树,可以拆成 2 (子树根),6,7,8(以 6 为根的子树),4(以 4 为根的子树),三部分,这三部分的点数加起来就是这棵子树的大小。

所以一个子树可以拆成子树根(一个节点)和每一棵以它的孩子为根的子树,所以这棵子树的大小就是所有以它的孩子为根的子树的大小的和再加 1。

接下来我们来研究如何通过代码解决这样的问题,对于当前节点来讲我们需要让它先搜索它的所有子节点,得到这些子节点的子树的大小,加起来再加 11 。

首先我们需要一个数组sz记录以每个点为根的子树的大小。

然后我们可以把搜索的dfs函数返回值改为int类型,返回以当前节点u为根的子树的大小。这样我们在找每一个与当前节点u相连的子节点v的时候,把到v去搜索得到的返回值加进sz[u]上,这样就把以u的每个子节点为根的子树的大小都加进来了,最后再给sz[u]加上 11(u节点本身),返回就可以了。

代码就是这样

​​​​​​​
int sz[110];
int dfs(int u, int fa) {for (int i = 0; i < G[u].size(); i++) {int v = G[u][i];if (v != fa) {sz[u] += dfs(v, u);}}sz[u]++;return sz[u];
}
 
 

求解每棵子树的大小:自下而上。

如果大家把搜索过程画出来,把dfs序写出来会发现,一棵子树一定是在dfs序上一段连续的序列,这一点是dfs序一个非常好的性质,也是dfs序最有用的性质。

比如

图片

这棵树,以 1 为根,一种dfs序就是 1,2,6,7,8,4,3,5 ,会发现以每个点为根的子树都对应了这个dfs序的连续一段。

这个也是因为dfs本身就需要把当前点以下的所有点都搜完了才会返回到上一层的点。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/668344.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

c语言实现greedy snake(贪吃蛇)

##第一个小项目 大一学生寒假项目 最终实现效果如图 一.以C语言实现个人小项目 在我们快速学完了一个高级编程语言&#xff0c;就应该写一个小项目来加以巩固自己的学习成果。 所以今天&#xff0c;我们来尝试写一写greedy snake&#xff0c;对于大学生来说也是可以加强能…

Gateway API 实践之(七)FSM Gateway 的负载均衡算法

FSM Gateway 流量管理策略系列&#xff1a; 故障注入黑白名单访问控制限速重试会话保持健康检查负载均衡算法TLS 上游双向 TLS 在微服务和 API 网关架构中&#xff0c;负载均衡是至关重要的&#xff0c;它确保每个服务实例都能平均地处理请求&#xff0c;同时也为高可用性和故…

python 基础知识点(蓝桥杯python科目个人复习计划34)

今日复习内容&#xff1a;以做题为主 例题1&#xff1a;Alice 和 Bob的爱恨情仇 题目描述&#xff1a; Alice和Bob最近正在学习博弈论&#xff0c;为了学以致用&#xff0c;他们找来了一大堆的小饼干 &#xff0c;并通过博弈的方式来吃掉这些小饼干。他们轮流对这些饼干进行…

随机森林超参数的网格优化(机器学习的精华--调参)

随机森林超参数的网格优化&#xff08;机器学习的精华–调参&#xff09; 随机森林各个参数对算法的影响 影响力参数⭐⭐⭐⭐⭐几乎总是具有巨大影响力n_estimators&#xff08;整体学习能力&#xff09;max_depth&#xff08;粗剪枝&#xff09;max_features&#xff08;随机…

mysql学习打卡day22

今日成果&#xff1a; select * from employees where salary > (select avg(salary) from employees); -- 查询超过平均工资的员工select * from clients where client_id not in (select distinct client_id from invoices); -- 查询没有发票的用户 感谢各位读者查阅&…

ASP.NET Core 预防开放式重定向攻击

写在前面 为预防钓鱼网站的常用套路&#xff0c;在进行 Web 应用程序的开发时&#xff0c;原则上应该将所有由用户提交的数据视为不可信。如果应用程序中包含了基于 URL 内容重定向的功能&#xff0c;需要确保这种类型的重定向操作只能在应用本地完成&#xff0c;或者明确判断…

[技术杂谈]如何下载vscode历史版本

网站模板&#xff1a; https://code.visualstudio.com/updates/v1_85 如果你想下载1.84系列可以访问https://code.visualstudio.com/updates/v1_84​​​​​​ 然后看到&#xff1a; 选择对应版本下载即可&#xff0c;我是windows x64系统选择x64即可开始下载

Oracle11g安装配置详细教程

Oracle 11g的安装和配置是一个详尽的过程&#xff0c;涉及多个步骤。以下是基于Oracle 11g R2&#xff08;第二个发布版本&#xff09;在Windows环境下的安装和基本配置的概述。请注意&#xff0c;Oracle 11g在不同的操作系统上的安装步骤可能会有所不同&#xff0c;此处以Wind…

MQTT在linux下服务端和客户端的应用

MQTT&#xff08;Message Queuing Telemetry Transport&#xff09;是一种轻量级、开放标准的消息传输协议&#xff0c;设计用于受限设备和低带宽、不稳定网络的通信。 MQTT的一些关键特点和概念&#xff1a; 发布/订阅模型&#xff1a; MQTT采用发布/订阅&#xff08;Publ…

QCustomplot实现灰度曲线图

从 QCustomplot官网 https://www.qcustomplot.com/index.php/download 下载支持文件。首页有些demo可以进行参考学习。 新建一个Qt工程&#xff0c;将下载得到的qcustomplot.h和qcustomplot.cpp文件加入到当前工程。pro文件中加上 printsupport 在ui界面中&#xff0c;添加一…

云服务器总结

1.服务器重装系后远程连接报错 Host key for xxx.xxx.xxx.xxx has changed and you have requested strict checking. 问题原因 ssh会把你每个你访问过计算机的公钥(public key)都记录在~/.ssh/known_hosts。当下次访问相同计算机时&#xff0c;OpenSSH会核对公钥。如果公钥不…

344. 反转字符串(力扣LeetCode)

文章目录 344. 反转字符串题目描述reverse函数双指针 344. 反转字符串 题目描述 编写一个函数&#xff0c;其作用是将输入的字符串反转过来。输入字符串以字符数组 s 的形式给出。 不要给另外的数组分配额外的空间&#xff0c;你必须原地修改输入数组、使用 O(1) 的额外空间…

数据库笔记——分析总结聚集索引、非聚集索引和覆盖索引

一、首先深入浅出理解索引结构 来自聚集索引和非聚集索引 实际上我们可以将索引理解为一种目录&#xff0c;索引可分为聚类索引和非聚类索引。   我们的汉语字典的正文本身就是一个聚集索引。比如&#xff0c;我们要查“安”字&#xff0c;就会很自然地翻开字典的前几页&…

【Linux】信号-上

欢迎来到Cefler的博客&#x1f601; &#x1f54c;博客主页&#xff1a;折纸花满衣 &#x1f3e0;个人专栏&#xff1a;题目解析 &#x1f30e;推荐文章&#xff1a;【LeetCode】winter vacation training 目录 &#x1f449;&#x1f3fb;信号的概念与产生jobs命令普通信号和实…

BridgeTower:融合视觉和文本信息的多层语义信息,主打复杂视觉-语言任务

BridgeTower 核心思想子问题1&#xff1a;双塔架构的局限性子问题2&#xff1a;不同层次的语义信息未被充分利用子问题3&#xff1a;模型扩展性和泛化能力 核心思想 论文&#xff1a;https://arxiv.org/pdf/2206.08657.pdf 代码&#xff1a;https://github.com/microsoft/Bri…

大数据概念与术语简介

介绍 大数据是一个总称&#xff0c;用于描述从大型数据集中收集、组织、处理和获取见解所需的非传统策略和技术。虽然处理超出单台计算机的计算能力或存储容量的数据并不是一个新问题&#xff0c;但近年来&#xff0c;这种类型的计算的普及性、规模和价值大大扩展。 在本文中…

K8s之configMap

1. 概述​ 1.1 什么是configMap​ 1.1 什么是configMap configMap是Kubernetes中的一种资源对象&#xff0c;用于存储配置数据。它可以包含键值对&#xff0c;也可以包含来自文件的配置数据。configMap的作用是将配置数据与应用程序的容器分离&#xff0c;使得配置可以在不重…

基于Java SSM框架实现网上租车系统项目【项目源码+论文说明】计算机毕业设计

基于java的SSM框架实现网上租车系统演示 摘要 随着现在网络的快速发展&#xff0c;网上管理系统也逐渐快速发展起来&#xff0c;网上管理模式很快融入到了许多商家的之中&#xff0c;随之就产生了“网上租车系统”&#xff0c;这样就让网上租车系统更加方便简单。 对于本网上…

C 练习实例55-学习使用按位取反~

复习知识点 原码&#xff1a;最高位为符号位&#xff0c;0代表正数&#xff0c;1代表负数 反码&#xff1a;正数的反码与原码一致&#xff0c;负数的反码保持符号位不变&#xff0c;其余的按位取反 补码&#xff1a;正数的补码与原码一致&#xff0c;负数的补码等于其反码加…

JAVA Web 学习(五)Nginx、RPC、JWT

十二、反向代理服务器——Nginx 支持热部署&#xff0c;几乎可以做到 7 * 24 小时不间断运行&#xff0c;即使运行几个月也不需要重新启动&#xff0c;还能在不间断服务的情况下对软件版本进行热更新。性能是 Nginx 最重要的考量&#xff0c;其占用内存少、并发能力强、能支持…