【洛谷 P8744】[蓝桥杯 2021 省 A] 左孩子右兄弟 题解(深度优先搜索+贪心算法+树形DP+邻接表)

[蓝桥杯 2021 省 A] 左孩子右兄弟

题目描述

对于一棵多叉树,我们可以通过“左孩子右兄弟”表示法,将其转化成一棵二叉树。

如果我们认为每个结点的子结点是无序的,那么得到的二叉树可能不唯一。换句话说,每个结点可以选任意子结点作为左孩子,并按任意顺序连接右兄弟。

给定一棵包含 N N N 个结点的多叉树,结点从 1 1 1 N N N 编号,其中 1 1 1 号结点是根,每个结点的父结点的编号比自己的编号小。请你计算其通过"左孩子右兄弟"表示法转化成的二叉树,高度最高是多少。(只有根结点这一个结点的树高度为 0 0 0

例如如下的多叉树:

可能有以下 3 3 3 种 (这里只列出 3 3 3 种, 并不是全部) 不同的 “左孩子右兄弟” 表示:

其中最后一种高度最高, 为 4 4 4

输入格式

输入的第一行包含一个整数 N N N

以下 N − 1 N-1 N1 行, 每行包含一个整数, 依次表示 2 2 2 N N N 号结点的父结点编号。

输出格式

输出一个整数表示答案。

样例 #1

样例输入 #1

5
1
1
1
2

样例输出 #1

4

提示

对于 30 % 30 \% 30% 的评测用例, 1 ≤ N ≤ 20 1 \leq N \leq 20 1N20;

对于所有评测用例, 1 ≤ N ≤ 1 0 5 1 \leq N \leq 10^5 1N105

蓝桥杯 2021 第一轮省赛 A 组 H 题。


思路

首先,定义一个全局变量dp[N],dp[i]存储的是节点i作为根的子树转化为二叉树后的最大高度。

定义一个全局的vector数组child[N],用于存储每个节点的所有子节点。例如,child[i]存储的是节点i的所有子节点。

从输入中读取节点数量n,然后读取每个节点的父节点编号,并将当前节点加入到父节点的子节点列表中。

接下来,从根节点1开始进行深度优先搜索。在每个节点x处,遍历其所有子节点。

d p [ i ] dp[i] dp[i] 表示节点 i i i 作为根的子树转化为二叉树后的最大高度, c c c 表示节点 i i i 的子节点, s z sz sz 表示节点 i i i 的孩子数量。节点 i i i 作为根的子树转化为二叉树后的最大高度等于该节点孩子的数量加上孩子节点中作为根的子树转化为二叉树后的最大高度。状态转移方程为:

d p [ i ] = s z + m a x c ∈ c h i l d [ i ] ( d p [ c ] ) dp[i] = sz + max_{c \in child[i]}(dp[c]) dp[i]=sz+maxcchild[i](dp[c])

对每个子节点i,先通过递归调用dfs(i)进行深度优先搜索,然后更新dp[x]为dp[x]和dp[i]中的最大值。最后,将节点x的子节点数量sz加到dp[x]上,因为每个子节点都可以作为一个新的层级添加到二叉树中。

最后,输出dp[1],即根节点作为根的子树转化为二叉树后的最大高度,即为所求的二叉树的最大高度。


AC代码

#include <algorithm>
#include <cstring>
#include <iostream>
#include <vector>
#define mp make_pair
#define AUTHOR "HEX9CF"
using namespace std;
using ll = long long;const int N = 1e6 + 7;
const int INF = 0x3f3f3f3f;
const ll MOD = 1e9 + 7;int n;
ll dp[N];vector<int> child[N];void dfs(int x) {int sz = 0;for (const auto i : child[x]) {// 访问孩子dfs(i);sz++;dp[x] = max(dp[x], dp[i]);}dp[x] += sz;
}int main() {ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);memset(dp, 0, sizeof(dp));cin >> n;for (int i = 2; i <= n; i++) {int fa;cin >> fa;child[fa].push_back(i);}dfs(1);cout << dp[1];return 0;
}

今天是植树节,给大家准备了些二叉树苗(bushi)

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

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

相关文章

深度学习系列62:Agent入门

1 anget介绍和openai标准接口 agent的核心是其代理协同工作的能力。每个代理都有其特定的能力和角色&#xff0c;你需要定义代理之间的互动行为&#xff0c;即当一个代理从另一个代理收到消息时该如何回复。 agent目前大多使用openai标准接口调用LLM服务&#xff0c;说明如下。…

从自媒体小白到优质KOL,你只差这些个人IP提效神器了!

在数字化浪潮的推动下&#xff0c;社交媒体已成为连接品牌与消费者的重要桥梁。然而&#xff0c;面对众多的社交平台、复杂的数据分析和日益增长的用户需求&#xff0c;社媒运营者常常感到力不从心。高效的社交媒体运营不仅可以提升品牌形象&#xff0c;还能促进产品销售&#…

Redisson分布式锁解决方案

官方地址 官网: https://redisson.org github: https://github.com/redisson/redisson 基于setnx实现的分布式锁存在的问题 redisson分布式锁原理 不可重入: 利用hash结构记录线程id和重入次数不可重试: 利用信号量和PubSub功能实现等待、唤醒, 获取锁失败的重试机制超时释放…

【Java设计模式】十九、中介者模式

文章目录 1、中介者模式2、案例3、总结 1、中介者模式 如图&#xff1a; 同事类之间关联较多时&#xff0c;整体出现网状结构&#xff0c;耦合度极高。一个对象一变动&#xff0c;好多对象都得改。若变为右边的星形结构&#xff0c;则一个类的变动&#xff0c;只影响自身与中介…

TypeScript -哲学 Mapped types

1、快速复制另一个类型 2、对之前的类型进行重写 3、 4、 注意&#xff1a;这里直接 报错&#xff1a;因为模版字符串只能包含 不能退出 k的来源&#xff0c;所以报错。 Remove a property from a type

php 对接Bigo海外广告平台收益接口Reporting API

今天对接的是Bigo广告reporting api接口&#xff0c;拉取广告收益回来自己做统计。记录分享给大家 首先是文档地址,进入到BIGO后台就能看到文档地址以及参数&#xff1a; 文档地址&#xff1a;https://www.bigossp.com/guide/sdk/reportingApi/doc?type1 接入这些第三方广告…

鸿蒙Harmony应用开发—ArkTS声明式开发(基础手势:Text)

显示一段文本的组件。 说明&#xff1a; 该组件从API Version 7开始支持。后续版本如有新增内容&#xff0c;则采用上角标单独标记该内容的起始版本。 子组件 可以包含Span和ImageSpan子组件。 接口 Text(content?: string | Resource, value?: TextOptions) 从API versi…

掌控无显示器Linux开发板:VNC远程桌面接入指南

掌控无显示器Linux开发板&#xff1a;VNC远程桌面接入指南 Linux开发板是许多技术人员常用的工具&#xff0c;但有时它们并不配备显示器。这时&#xff0c;VNC&#xff08;Virtual Network Console&#xff09;软件就成为了一个非常有用的工具&#xff0c;它允许用户通过网络远…

小程序开发——获取设备信息 API(二)

ty.device.getDeviceNumWithDpCode 根据 dpCode 获取群组下具备此 dpCode 的设备数量。如果是一个分享的群组&#xff0c;请通过接口获取。 需引入DeviceKit&#xff0c;且在>2.4.0版本才可使用 请求参数 Object object 属性类型默认值必填说明groupIdstring是groupId 群…

python--类与面向对象-2

一、对象在文本中的输出 class Person: def __init__(self,name,agg,live_value,money): self.namename self.aggagg self.live_valuelive_value self.moneymoney def describe(): print(%s的攻击力是%s%(self.name,self.agg)) pPerson(bob,10,10000,100) bPerson(tony,…

软考高级:面向对象分析概念和例题

作者&#xff1a;明明如月学长&#xff0c; CSDN 博客专家&#xff0c;大厂高级 Java 工程师&#xff0c;《性能优化方法论》作者、《解锁大厂思维&#xff1a;剖析《阿里巴巴Java开发手册》》、《再学经典&#xff1a;《Effective Java》独家解析》专栏作者。 热门文章推荐&am…

[综述笔记]Graph Neural Networks in Network Neuroscience

论文网址&#xff1a;Graph Neural Networks in Network Neuroscience | IEEE Journals & Magazine | IEEE Xplore 英文是纯手打的&#xff01;论文原文的summarizing and paraphrasing。可能会出现难以避免的拼写错误和语法错误&#xff0c;若有发现欢迎评论指正&#xf…