P6838 [IOI 2020] 网络站点
P6838\(\mathbf{} \begin{Bmatrix} \frac{{\Large LUOGU_P6838} }{{\color{Red}\Large Solution} }\mathbf{} {No.35} \end{Bmatrix}\times{}\) NeeDna
题意
第一次运行你的程序时候给你一棵树,然后你需要给他重新标号,第二次运行你的程序时候每次询问会给出一个你报好过的树上的起点 \(s\) 和终点 \(t\),以及起点的所有邻居,你需要返回 \(s\to t\) 的路径上的第二个点是什么。
分析
我们发现他会运行两次我们的程序,所以我们没有所谓的全局变量,我们能用的信息只有节点标号。接下来发现这题其实是这样的:
每次询问给我们一个节点的所有儿子编号和其父亲的编号,问在此节点为根时,另一个节点属于哪一个儿子。
那我们根据问题中有很多从属关系很容易联想到 dfs 序。
题解
但如果我们真的用 dfs 序去做这道题,我们会发现就能判断除了最后一个儿子和自己父亲的所有儿子,这个时候我们会想,加入我们用后序遍历呢?这样似乎可以解决这个问题。但是第一个儿子和自己的父亲就不能判断了。所以我们结合一下这两个方法,我们奇数层用先序遍历,偶数层用后序遍历就好啦。

浙公网安备 33010602011771号