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.hqwc.cn/news/54130.html

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

相关文章

Python实现决策树算法:完整源码逐行解析

决策树是一种常用的机器学习算法&#xff0c;它可以用来解决分类和回归问题。决策树的优点是易于理解和解释&#xff0c;可以处理数值和类别数据&#xff0c;可以处理缺失值和异常值&#xff0c;可以进行特征选择和剪枝等操作。决策树的缺点是容易过拟合&#xff0c;对噪声和不…

C# 外观模式

概述 外观模式&#xff08;Facade Pattern&#xff09;是一种结构型设计模式&#xff0c;它提供了一个统一的接口&#xff0c;用于访问子系统中的一组接口。外观模式隐藏了子系统的复杂性&#xff0c;使得客户端可以通过简单的接口与子系统进行交互。 外观模式定义了一个高层…

mediasoup Lite ICE实现说明

目录 一. 前言 二. Lite ICE流程 三. STUN协议说明 STUN Header STUN Body 四. mediasoup Lite ICE实现源码剖析 一. 前言 ICE 是一种交互式建立连接的流程协议。ICE 有两种模式&#xff08;Full ICE 和 Lite ICE&#xff09;&#xff0c;Full ICE 要求建立连接的双方都要…

iOS——锁与死锁问题

iOS中的锁 什么是锁锁的分类互斥锁1. synchronized2. NSLock3. pthread 递归锁1. NSRecursiveLock2. pthread 信号量Semaphore1. dispatch_semaphore_t2. pthread 条件锁1. NSCodition2. NSCoditionLock3. POSIX Conditions 分布式锁NSDistributedLock 读写锁1. dispatch_barri…

AOF日志:宕机了,Redis如何避免数据丢失

当服务器宕机后&#xff0c;数据全部丢失&#xff1a;我们很容易想到的一个解决方案是从后端数据库恢复这些数据&#xff0c;但这种方式存在两个问题&#xff1a;一是&#xff0c;需要频繁访问数据库&#xff0c;会给数据库带来巨大的压力&#xff1b;二是&#xff0c;这些数据…

Rust 编程小技巧摘选(6)

目录 Rust 编程小技巧(6) 1. 打印字符串 2. 重复打印字串 3. 自定义函数 4. 遍历动态数组 5. 遍历二维数组 6. 同时遍历索引和值 7. 迭代器方法的区别 8. for_each() 用法 9. 分离奇数和偶数 10. 判断素数&#xff08;质数&#xff09; Rust 编程小技巧(6) 1. 打印…

剑指offer60.n个骰子的点数

这道题很简单&#xff0c;看完题目就会。看完题就会想到用动态规划的方法&#xff0c;如果我要用i个骰子拿到j个点数&#xff0c;那么我只能在i-1个骰子拿到j-1个点的情况下再用第i个骰子投出一个1&#xff0c;或者i-1个骰子拿到j-2个点的情况下再用第i个骰子投出一个2&#xf…

Unity学习参考文档和开发工具

☺ unity的官网文档&#xff1a;脚本 - Unity 手册 ■ 学习方式&#xff1a; 首先了解unity相关概述&#xff0c;快速认识unity编辑器&#xff0c;然后抓住重点的学&#xff1a;游戏对象、组件|C#脚本、预制体、UI ☺ 学习过程你会发现&#xff0c;其实Unity中主要是用c#进行开…

[Docker实现测试部署CI/CD----自由风格和流水线的CD操作(6)]

目录 12、自由风格的CD操作发布 V1.0.0 版本修改代码并推送GitLab 中项目打 Tag 发布 V2.0.0 版本Jenkins 配置 tag 参数添加 Git 参数添加 checkout 命令修改构建命令配置修改 SSH 配置 部署 v1.0.0重新构建工程构建结果 部署 v2.0.0重新构建工程访问 部署v3.0.0 13、流水线任…

微信小程序animation动画,微信小程序animation动画无限循环播放

需求是酱紫的&#xff1a; 页面顶部的喇叭通知&#xff0c;内容不固定&#xff0c;宽度不固定&#xff0c;就是做走马灯&#xff08;轮播&#xff09;效果&#xff0c;从左到右的走马灯&#xff08;轮播&#xff09;&#xff0c;每播放一遍暂停 1500ms &#xff5e; 2000ms 刚…

npm -v无法显示版本号

情况&#xff1a; 删除C盘下.npmrc文件后解决。路径 C:\Users\Dell 记录一下这个解法。

【eNSP】Telnet远程登录

Telnet远程登录 eNSP软件TelnetTelnet远程登录-路由连接关闭防火墙eNSP根据图1画图路线配置路由端口IP配置路由R1改名配置接口IP 配置路由R2 配置R2的远程登录设置登录用户授权级别退出登录超时时间 Telnet测试 eNSP软件 eNSP(Enterprise Network Simulation Platform)是一款由…