4310 树的DFS(dfs序列)

news/2025/2/22 19:32:26/

1. 问题描述:​​​​​​​

给定一棵 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
来源:https://www.acwing.com/problem/content/description/4313/

2. 思路分析:

分析题目可以知道其实考察的是树的前序遍历,其中需要使用到的一个性质:每一棵子树在dfs的前序遍历中一定是连续的一段,根据这个性质我们就比较好处理了,我们可以在前序遍历的序列中找到节点u对应的位置,往后移动k - 1个位置就是我们要求解的答案的位置,找到这个位置对应的编号即可。所以我们可以使用数组p来存储数字的编号,q存储编号对应的位置,在dfs遍历节点的过程中更新p和q,最终根据p,q的值输出对应的答案即可。

3. 代码如下:

由于数据规模比较大所以提交上去爆栈了:

import collections
from typing import List
import sysclass Solution:count, mp = None, Nonedef dfs(self, u: int, p: List[int], q: List[int], g: List[List[int]]):# count可以理解为下标p[self.count] = uself.mp[u] = 1q[u] = self.countself.count += 1for next in g[u]:self.dfs(next, p, q, g)self.mp[u] += self.mp[next]def process(self):n, m = map(int, input().split())g = [list() for i in range(n + 10)]a = list(map(int, input().split()))# 创建有向图for i in range(n - 1):g[a[i]].append(i + 2)for i in range(1, n + 1):if g[i]:# 当前节点的子树按照节点编号从小到大排序g[i].sort()# p存储第i个点对应的编号, q存储编号为i对应的下标p, q = [0] * (n + 10), [0] * (n + 10)self.count = 0# mp用来计算节点的子树对应的节点数目, 用来判断是否有解self.mp = collections.defaultdict(int)self.dfs(1, p, q, g)for i in range(m):u, k = map(int, input().split())if self.mp[u] < k: print(-1)else:# 找到对应的位置之后对应位置的编号就是答案print(p[q[u] + k - 1])if __name__ == '__main__':# 设置最大递归调用次数sys.setrecursionlimit(1000000)Solution().process()

http://www.ppmy.cn/news/488807.html

相关文章

hdu 4310

http://acm.hdu.edu.cn/showproblem.php?pid3979 减弱版的题目 http://acm.hdu.edu.cn/showproblem.php?pid4310 水题&#xff0c;在网上搜下是排序不等式&#xff0c;我也不知道什么叫排序不等式&#xff0c;如果深入的思考的话还是容易想出来的 这题肯定是贪心是肯定的&…

23.6.20.今天在理解项目业务。

今天理解了下复核是什么&#xff0c;挺好的&#xff0c;明天又有两个功能&#xff0c;加油吧。

4310. 树的DFS 邻接链表深搜

文章目录 [4310. 树的DFS](https://www.acwing.com/problem/content/4313/) 4310. 树的DFS 给定一棵 n 个节点的树。 节点的编号为 1∼n&#xff0c;其中 1 号节点为根节点&#xff0c;每个节点的编号都大于其父节点的编号。 现在&#xff0c;你需要回答 q 个询问。 每个询…

TPLink4310刷机

目录说明&#xff1a; MW4530R (水星4530R原厂固件、Firmware&#xff0c;uboot) TPLink4300 (TP 4310原厂固件、Firmware&#xff0c;uboot) TPLink4310 (TP 4310原厂固件、Firmware&#xff0c;uboot) OpenWRT(OP固件&#xff0c;均不含uboot&#xff0c;供4530,4310,4300原厂…

ubuntu设置开机启动命令

文章目录 概述系统版本设置开机启动命令1. 查看rc-local服务状态2. 设置rc-local服务开机启动3. 手动创建系统自启动服务4. 创建rc.local文件5. 设置rc.local文件权限6.添加开机启动命令7.启用rc-local服务8.查看rc-local服务状态9.重启系统 概述 本文档主要记录Ubuntu系统使用…

【带你刷《剑指Offer》系列】【每天40分钟,跟我一起用50天刷完 (剑指Offer)】第一天

专注 效率 记忆 预习 笔记 复习 做题 欢迎观看我的博客&#xff0c;如有问题交流&#xff0c;欢迎评论区留言&#xff0c;一定尽快回复&#xff01;&#xff08;大家可以去看我的专栏&#xff0c;是所有文章的目录&#xff09;   文章字体风格&#xff1a; 红色文字表示&#…

Matthew Ball:十多年后AR/VR为何依然发展缓慢?

2010年&#xff0c;Magic Leap和微软就开始研发AR技术&#xff0c;直到2012年Oculus才成立&#xff0c;AR/VR经过了13年左右的时间&#xff0c;虽然受到越来越多人关注&#xff0c;但发展依然缓慢。VR的主要应用场景还是游戏&#xff0c;但VR游戏只是游戏市场的一个分支&#x…

java、jvm与.net

现在sun已经被oracle收购了&#xff01;也从侧面验证了作者的一些论断&#xff01; 当然从技术上看&#xff0c;这篇文章也是分析很精辟。反正我自己感觉c很好用&#xff0c;java以及所谓的OO更多是一些概念。 Java在自取灭亡 一个比较Java语言发展的讨论贴&#xff0c;非常…