AcWing 4310:树的DFS ← vector、auto、邻接表

【题目来源】
https://www.acwing.com/problem/content/description/4313/

【题目描述】
给定一棵 n 个节点的树。
节点的编号为 1∼n,其中 1 号节点为根节点,每个节点的编号都大于其父节点的编号。
现在,你需要回答 q 个询问。
每个询问给定两个整数 ui,ki。
我们希望你用 DFS(深度优先搜索)算法来遍历根节点为 ui 的子树。
我们规定,当遍历(或回溯)到某一节点时,下一个遍历的目标应该是它的未经遍历的子节点中编号最小的那一个子节点。

例如,上图实例中:
如果遍历根节点为 1 号节点的子树,则子树内各节点的遍历顺序为 [1,2,3,5,6,8,7,9,4]。
如果遍历根节点为 3 号节点的子树,则子树内各节点的遍历顺序为 [3,5,6,8,7,9]。
如果遍历根节点为 7 号节点的子树,则子树内各节点的遍历顺序为 [7,9]。
如果遍历根节点为 9 号节点的子树,则子树内各节点的遍历顺序为 [9]。
每个询问就是让你计算采用规定的 DFS 算法来遍历根节点为 ui 的子树时,第 ki 个被遍历到的节点的编号。

【输入格式】
第一行包含两个整数 n,q。
第二行包含 n−1 个整数 p2,p3,…,pn,其中 pi 表示第 i 号节点的父节点的编号。
接下来 q 行,每行包含两个整数 ui,ki,表示一组询问。

【输出格式】
共 q 行,每组询问输出一行一个整数表示第 ki 个被遍历到的节点的编号。
如果第 ki 个被遍历到的节点不存在,则输出 −1。

【数据范围】
前三个测试点满足 2≤n≤20,1≤q≤20。
所有测试点满足 2≤n≤2×10^5,1≤q≤2×10^5,1≤pi<i,1≤ui,ki≤n。

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

【输出样例】
3
6
8
-1
9
4

【算法分析】

﹣注意本例中结点的编号从1开始,所以才有了代码中的dfs(1)。
﹣本题要注意区分结点的编号树的DFS序列的下标的区别。
for(auto iter:vec)的用法:C++11标准引入了 auto 类型说明符。它通过变量的初始值或者表达式中参与运算的数据类型来推断变量的类型。例如:

#include <bits/stdc++.h>
using namespace std;int main(){string s;cin>>s;for(auto t:s){cout<<t<<endl;}return 0;
} /*
in:
abc123out:
a
b
c
1
2
3
*/

-对于一棵树的DFS序列而言,每棵子树的DFS序列对应其中的连续一段。
-树
可视为没有环的“有向无权图”。故可借鉴利用STL中的vector实现“有向无权图”的邻接表表示存图的代码实现存树。

/* 利用STL中的vector实现有向无权图的邻接表表示 */
#include <bits/stdc++.h>
using namespace std;
const int N = 1e5;
vector<int> v[N];int main() {int n,m; //n点数,m边数cin>>n>>m;int s,t; //边的邻接点序号,从0开始for(int i=0; i<m; i++) {cin>>s>>t;v[s].push_back(t);// v[t].push_back(s); 与“无向无权图”的邻接表表示相比,就少此行代码}for(int i=0; i<n; i++) {cout<<"V"<<i+1<<":";for(int j=0; j<v[i].size(); j++) {if(j==v[i].size()-1) cout<<v[i][j];else cout<<v[i][j]<<"->";}cout<<endl;}return 0;
}

 以上关于有向无权图”的内容解析详见:https://blog.csdn.net/hnjzsyjyj/article/details/101233485


【算法代码】

#include <bits/stdc++.h>
using namespace std;const int maxn=2e5+5;
int val[maxn]; //val[i]存储DFS序列中下标为i的结点在树中的结点编号
int id[maxn]; //id[i]存储结点编号为i的结点在树的DFS序列中的下标  
int cnt[maxn]; //cnt[i]存储以结点编号为i的结点为根的子树中的结点数 
vector<int> g[maxn];int cur; //树的DFS序列的下标 
void dfs(int x){ //x为树的结点编号1~n val[cur]=x;id[x]=cur;cur++;cnt[x]=1;for(auto t:g[x]){dfs(t);cnt[x]+=cnt[t];}
}int main(){int n,m;cin>>n>>m;for(int i=2;i<=n;i++){int t;cin>>t;g[t].push_back(i);}dfs(1);//for(int i=1;i<=n;i++) sort(g[i].begin(),g[i].end());while(m--){int u,k;cin>>u>>k;if(cnt[u]<k) cout<<"-1"<<endl;else cout<<val[id[u]+k-1]<<endl;}return 0;
}/*
in:
9 6
1 1 1 3 5 3 5 7
3 1
1 5
3 4
7 3
1 8
1 9out:
3
6
8
-1
9
4
*/






【参考文献】
https://www.acwing.com/solution/content/97544/
https://blog.csdn.net/Apol1o_/article/details/124563889
https://blog.csdn.net/Jacob0824/article/details/123301752

https://www.acwing.com/solution/content/103008/




 

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

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

相关文章

RabbitMQ(二)

二、高级特性、应用问题以及集群搭建 高级特性 1.消息的可靠性投递 在使用RabbitMQ的时候&#xff0c;作为消息发送方希望杜绝任何消息丢失或者投递失败场景。RabbitMQ 为我们提供了两种方式用来控制消息的投递可靠性模式。 rabbitMQ整个消息投递的路径为&#xff1a; produ…

springCache-缓存

SpringCache 简介&#xff1a;是一个框架&#xff0c;实现了基于注解的缓存功能&#xff0c;底层可以切换不同的cache的实现&#xff0c;具体是通过CacheManager接口实现 使用springcache,根据实现的缓存技术&#xff0c;如使用的redis,需要导入redis的依赖包 基于map缓存 …

简述静态网页和动态网页的区别。简述 Webl.0 和 Web2.0 的区别。安装tomcat8,配置服务启动脚本,部署jpress应用

静态网页和动态网页区别 静态网页和动态网页是两种常见的网页类型&#xff0c;它们在内容生成和交互方式上存在不同。 静态网页是在服务器上提前生成好的网页&#xff0c;它的内容在访问时不会发生变化。静态网页通常由HTML、CSS和JavaScript等静态文件组成&#xff0c;这些文…

无涯教程-Perl - bless函数

描述 此函数告诉REF引用的实体,它现在是CLASSNAME包中的对象,如果省略CLASSNAME,则为当前包中的对象。建议使用bless的两个参数形式。 语法 以下是此函数的简单语法- bless REF, CLASSNAMEbless REF返回值 该函数返回对祝福到CLASSNAME中的对象的引用。 例 以下是显示其…

Python web实战之 Django 的模板语言详解

关键词&#xff1a; Python、web开发、Django、模板语言 概要 作为 Python Web 开发的框架之一&#xff0c;Django 提供了一套完整的 MVC 模式&#xff0c;其中的模板语言为开发者提供了强大的渲染和控制前端的能力。本文介绍 Django 的模板语言。 1. Django 模板语言入门 Dj…

【Android】控件与布局入门 - 简易计算器

目录 1. 基础开发环境 2. 计算器的布局和相关按钮 3. 计算器的主要运算逻辑 4. APK 文件 5. 项目源码 1. 基础开发环境 JDK&#xff1a;JDK17 Android Studio&#xff1a;Android Studio Giraffe | 2022.3.1 Android SDK&#xff1a;Android API 34 Gradle: gradle-8.0-bi…

【Nginx基础】Nginx基础及安装

目录 Nginx出现背景Nginx 概念Nginx 作用Http 代理&#xff0c;反向代理负载均衡&#xff1a;内置策略和扩展策略内置策略&#xff1a;轮询内置策略&#xff1a;加权轮询内置策略&#xff1a;IP hash 动静分离 安装 NginxWindows下安装&#xff08;nginx-1.16.1&#xff09;Lin…

计算机毕设 深度学习实现行人重识别 - python opencv yolo Reid

文章目录 0 前言1 课题背景2 效果展示3 行人检测4 行人重识别5 其他工具6 最后 0 前言 &#x1f525; 这两年开始毕业设计和毕业答辩的要求和难度不断提升&#xff0c;传统的毕设题目缺少创新和亮点&#xff0c;往往达不到毕业答辩的要求&#xff0c;这两年不断有学弟学妹告诉…

EtherCAT转Profinet网关连接西门子PLC与凯福科技总线步进驱动器通讯

西门子S7-1200/1500系列的PLC&#xff0c;采用Profinet实时以太网通讯协议&#xff0c;需要连接带EtherCAT的通讯功能的伺服驱动器等设备&#xff0c;就必须进行通讯协议转换。捷米特JM-EIP-RTU系列的网关提供了&#xff0c;快速可行的解决方案 捷米特JM-ECTM-PN在PROFINET一侧…

Linux下进程的特点与环境变量

目录 进程的特点 进程特点的介绍 进程时如何实现并发性的 进程间如何切换 概念铺设 PC指针 上下文 环境变量 PATH 修改PATH HOME SHELL env 命令行参数 什么是命令行参数&#xff1f; 打印命令行参数 通过函数获得环境变量 getenv 命令行参数 env 修改环境变…

Linux从安装到实战 常用命令 Bash常用功能 用户和组管理

1.0初识Linux 1.1虚拟机介绍 1.2VMware Workstation虚拟化软件 下载CentOS; 1.3远程链接Linux系统 &FinalShell 链接finalshell半天没连接进去 他说ip adress 看IP地址是在虚拟机上 win11主机是 终端输入&#xff1a; ifconfig VMware虚拟机的设置 & ssh连接_snge…

[Pytorch]卷积运算conv2d

文章目录 [Pytorch]卷积运算conv2d一.F.Conv2d二.nn.Conv2d三.nn.Conv2d的运算过程 [Pytorch]卷积运算conv2d 一.F.Conv2d torch.nn.functional.Conv2d()的详细参数&#xff1a; conv2d(input: Tensor, weight: Tensor, bias: Optional[Tensor]None, stride: Union[_int, _s…

如何在 Android 上恢复已删除的视频|快速找回丢失的记忆

想知道是否有任何成功的方法可以从 Android 手机中检索已删除的视频&#xff1f;好吧&#xff0c;本指南将向您展示分步说明&#xff0c;让您轻松从手机中找回丢失的视频文件&#xff01; 您是否不小心从 Android 智能手机中删除了珍贵的生日视频&#xff1f;难道是无处可寻吗…

【计算机视觉|语音分离】期望在嘈杂环境中聆听:一个用于语音分离的不依赖于讲话者的“音频-视觉模型”

本系列博文为深度学习/计算机视觉论文笔记&#xff0c;转载请注明出处 标题&#xff1a;Looking to Listen at the Cocktail Party: A Speaker-Independent Audio-Visual Model for Speech Separation 链接&#xff1a;Looking to listen at the cocktail party: a speaker-in…

驱动工作原理

驱动原理 在Linux操作系统中&#xff0c;硬件驱动程序中实现对硬件直接操作&#xff0c;而用户空间&#xff0c;通过通用的系统调用接口&#xff08;open() 打开相应的驱动设备,ioctl()控制相应的功能等&#xff09;&#xff0c;实现对硬件操作&#xff0c;应用程序没有直接操作…

MySQL事务管理

MySQL事务管理 MySQL增删查改时的问题一.什么是事务&#xff1f;二.为什么会出现事务&#xff1f;三.事务的其他属性1. 事务的版本支持2. 事务的提交方式 四.事务的准备工作五.事务的操作1. 事务的正常操作2. 事务的异常验证与产出结论 六.事务的隔离级别1. 事务隔离级别概念2.…

Linux-centos花生壳实现内网穿透

Linux-centos花生壳实现内网穿透 官网教程 1.安装花生壳 下载网址 点击复制就可以复制下载命令了 wget "https://dl.oray.com/hsk/linux/phddns_5.2.0_amd64.rpm" -O phddns_5.2.0_amd64.rpm# 下载完成之后会多一个rpm文件 [rootlocalhost HuaSheng]# ls phddns_…

ios_base::out和ios::out、ios_base::in和ios::in、ios_base::app和ios::app等之间有什么区别吗?

2023年8月2日&#xff0c;周三晚上 今天我看到了这样的两行代码&#xff1a; std::ofstream file("example.txt", std::ios_base::out);std::ofstream file("example.txt", std::ios::out);这让我产生了几个疑问&#xff1a; 为什么有时候用ios_base::o…

一篇文章了解类成员定义表结构

文章目录 一篇文章了解类成员定义表结构 %Dictionary.ClassDefinition - 类定义表简介索引示例表结构 %Dictionary.ForeignKeyDefinition - 外键定义表简介索引示例表结构 %Dictionary.IndexDefinition - 索引定义表简介索引示例表结构 %Dictionary.MethodDefinition - 方法定义…

前端js--旋转幻灯片

效果图 代码 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta name"viewport" content"widthdevice-width, initial-scale1.0" /><link rel"stylesheet" href"…