#P9669. [ICPC2022 Jinan R] DFS Order 2

    ID: 8966 Type: RemoteJudge 1500ms 512MiB Tried: 0 Accepted: 0 Difficulty: 6 Uploaded By: Tags>2022O2优化背包树形 dpICPC

[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 (1jn1\le j\le n) position in this order means it is visited after j1j-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 (1v,jn)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 (1n500)n~(1\le n \le 500), the number of vertices in the tree.

Each of the next n1n-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 (1ui,vin,uivi)(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个节点,从11nn编号。

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

P想知道对于每个节点vv,有多少种不同的深度优先搜索顺序,使得vv出现在第jj个位置。对于每个vvjiv,jnj(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. 结束过程

输入格式

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

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

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

输出格式

对于每个从11nn的节点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