#P9669. [ICPC2022 Jinan R] DFS Order 2

[ICPC2022 Jinan R] DFS Order 2

题目描述

Prof. Pang has a rooted tree that is rooted at vertex 11 and has nn nodes. These nn nodes are numbered from 11 to nn.

Now he wants to start the depth-first search at the root. He wonders for each node vv, how many ways it can appear in the jj-th position of depth-first search order\textbf{depth-first search order}. The depth-first search order is the order of nodes visited during the depth-first search. A node appears in the jj-th (1≤j≤n1\le j\le n) position in this order means it is visited after j−1j-1 other nodes. Because sons of a node can be iterated in arbitrary order, multiple possible depth-first orders exist.

Prof. Pang wants to know for each node vv, how many different depth-first search order\textbf{depth-first search order}s such that vv appears in the jj-th position. For each v,j (1≤v,j≤n)v, j~(1 \le v, j \le n), compute the answer. Because the answer can be very large, output it modulo 998244353998244353.

Following is a pseudo-code for the depth-first search on a rooted tree. After calling main\textbf{main}(), dfs_order\texttt{dfs\_order} is the depth-first search order.

输入格式

The first line contains one integer n (1≤n≤500)n~(1\le n \le 500), the number of vertices in the tree.

Each of the next n−1n-1 lines describes an edge of the tree. Edge ii is denoted by two integers uiu_i and viv_i, the labels of vertices it connects (1≤ui,vi≤n,ui≠vi)(1\le u_i,v_i\le n, u_i\neq v_i).

It is guaranteed that the given edges form a tree.

输出格式

For each vertex vv from 11 to nn, output one line containing nn integers modulo 998244353998244353. The jj-th integer in the vv-th line should be the number of different depth-first search orders such that vv appears in the jj-th position.

题目大意

题目描述

P有一棵树,根节点是11,总共有nn个节点,从11到nn编号。

他想从根节点开始进行深度优先搜索。他想知道对于每个节点vv,在深度优先搜索中,它出现在第jj个位置的方式有多少种。深度优先搜索的顺序是在搜索过程中访问节点的顺序。节点出现在第j(1≤j≤nj(1 \le j \le n )个位置表示它在访问了j−1j - 1个其他节点之后才被访问。因为节点的子节点可以以任意顺序访问,所以有多种可能的深度优先搜索顺序。

P想知道对于每个节点vv,有多少种不同的深度优先搜索顺序,使得vv出现在第jj个位置。对于每个vv和j(i≤v,j≤n)j(i \le v,j \le n),计算答案。答案可能很大,所以输出时要取模998244353998244353。以下是深度优先搜索的伪代码,用于处理树。在调用main()main()函数后, dfs_order将会包含深度优先搜索的顺序。


算法 11 深度优先搜索的实现

1. 过程 DFS(节点 x)

2.	将x添加到dfs_order的末尾

3.	对于x的每个子节点y do               ·子节点可以以任意顺序遍历。

4.		DFS(y)

5.	结束循环

6. 结束过程

7. 过程 MAIN()

8.	将dfs_order设为全局变量

9.	dfs_order ← 空列表

10.	DFS(1)

11. 结束过程

输入格式

第一行包含一个整数n(1≤n≤500)n(1\le n\le 500),表示树中的节点数量。

接下来的n-1行描述了树的边。第i行包含两个整数uiu_i和viv_i,表示连接的两个节点的标签(1≤ui,vi≤n,ui≠vi)(1\le u_i,v_i\le n,u_i\not=v_i)。

保证给定的边构成一棵树。

输出格式

对于每个从11到nn的节点vv,输出一行,包含nn个整数,取模998244353998244353。在第vv行中,第jj个整数表示不同的深度优先搜索顺序中,节点vv出现在第jj个位置的数量。

翻译由@ayf2192538031提供
5
1 2
1 3
3 4
3 5
4 0 0 0 0
0 2 0 0 2
0 2 2 0 0
0 0 1 2 1
0 0 1 2 1