#P9872. [EC Final 2021] DFS Order

    ID: 9243 远端评测题 3000ms 1024MiB 尝试: 0 已通过: 0 难度: 3 上传者: 标签>2021O2优化深度优先搜索,DFS树的遍历ICPC

[EC Final 2021] DFS Order

Description

庞教授有一棵以 11 为根的树,这棵树有 nn 个节点。这 nn 个节点的编号从 11nn

现在他想从根节点开始进行深度优先搜索。他想知道对于每个节点 vv,它在深度优先搜索顺序中出现的最小和最大位置。深度优先搜索顺序是指在深度优先搜索过程中访问节点的顺序。一个节点出现在这个顺序中的第 jj 个位置(1jn1 \le j \le n)意味着它是在 j1j-1 个其他节点之后被访问的。由于一个节点的子节点可以以任意顺序进行迭代,因此存在多种可能的深度优先顺序。庞教授想知道对于每个节点 vv,使得 vv 出现在第 jj 个位置的最小值和最大值分别是多少。

以下是对根树进行深度优先搜索的伪代码。在其执行之后,dfs_order\texttt{dfs\_order} 是深度优先搜索顺序。

let dfs_order be an empty list

def dfs(vertex x):
    append x to the end of dfs_order.
    for (each son y of x): // sons can be iterated in arbitrary order.
        dfs(y)

dfs(root)

Input Format

第一行包含一个整数 T (1T106)T~(1 \le T \le 10^6),表示测试用例的数量。

对于每个测试用例,第一行包含一个整数 n (1n105)n~(1 \le n \le 10 ^ 5)。接下来的 n1n-1 行中的每一行包含两个整数 xxyy,表示节点 xx 是节点 yy 的父节点(1x,yn1\le x, y\le n)。这些边形成了一棵以 11 为根的树。

保证所有测试用例中 nn 的总和不超过 10610^6

Output Format

对于每个测试用例,输出 nn 行。第 ii 行包含两个整数,表示节点 ii 在深度优先搜索顺序中出现的最小和最大位置。

2
4
1 2
2 3
3 4
5
1 2
2 3
2 4
1 5
1 1
2 2
3 3
4 4
1 1
2 3
3 5
3 5
2 5

Hint

题面翻译由 ChatGPT-4o 提供。