#P1098. 【UNR #10】深搜 2
【UNR #10】深搜 2
小 O:UNR D2T2 缺投,我们能不能投一个?
$\qquad$小 M:我也想投,但是我们没有题怎么办?……要不搬一个吧。
$\qquad$小 O:行。我看【NOI2023】深搜这个题挺厉害,搬这个好了。
$\qquad$小 M:听说大家最喜欢 $n\le 20$,顺手改下数据范围吧。
深度优先搜索是一种常见的搜索算法。通过此算法,我们可以从一个无重边、无自环的无向连通图 $G = (V, E)$,和某个出发点 $s$,得到一棵树 $T$。
算法的流程描述如下:
- 将栈 $S$ 设置为空,并令 $T = (V, \varnothing)$,即 $T$ 的边集初始为空。
- 首先将出发点 $s$ 压入 $S$ 中。
- 访问栈顶节点 $u$,并将 $u$ 标记为“已访问的”。
- 如果存在与 $u$ 相邻且未被访问的节点,则任意地从这些节点中挑选一个记为 $v$。我们将边 $(u, v)$ 加入 $T$ 的边集中,并将 $v$ 压入栈 $S$ 中,然后回到步骤 3。若不存在这样的节点,则从栈中弹出节点 $u$。
可以证明,当图 $G$ 为连通图时,该算法会得到图的某一棵生成树 $T$。但算法得到的树 $\boldsymbol T$ 可能不是唯一的,它取决于搜索的顺序,也就是算法的第 4 步所选取的顶点。如果能够选取一个出发点 $s$ 和一种特定的搜索顺序,使得算法得到的树恰好是 $T$,则我们称 $\boldsymbol T$ 是 $\boldsymbol G$ 的一棵 DFS 树。
现在给定一张 $n$ 个点 $m$ 条边的无重边、无自环的无向连通图 $G=(V,E)$,请求出 $G$ 的不同 DFS 树 $T$ 个数。
由于答案可能十分巨大,你只需要输出方案数在模 $998244353$ 意义下的值。
输入格式
第一行输入两个正整数 $n,m$,表示图的点数与边数。
接下来 $m$ 行,每行两个正整数 $u,v$ 表示图的一条边。
输出格式
输出一行一个非负整数表示答案。
4 4
1 2
2 3
3 4
4 1
4
$4$ 棵 DFS 树如下:
- $(1,2),(2,3),(3,4)$;
- $(1,2),(2,3),(4,1)$;
- $(1,2),(3,4),(4,1)$;
- $(2,3),(3,4),(4,1)$。
4 6
1 2
1 3
1 4
2 3
2 4
3 4
12
这张图是完全图,在遍历完所有点前不会弹出节点,故 DFS 树必定为一条链,容易得到答案为 $4!/2=12$。
10 15
1 2
1 3
1 4
1 6
1 7
1 8
2 3
4 5
4 6
5 6
5 7
5 8
5 9
5 10
9 10
224
样例四 $\sim$ 样例七
见附件下载。
数据范围
对于所有数据,$1\le n\le 20$,$1\le m\le\frac{n(n-1)}{2}$,$1\le u,v\le n$,$u\neq v$。
| 子任务编号 | $n\le$ | 特殊性质 | 分值 |
|---|---|---|---|
| $1$ | $4$ | 无 | $4$ |
| $2$ | $8$ | $8$ | |
| $3$ | $20$ | A | $8$ |
| $4$ | $10$ | 无 | $10$ |
| $5$ | $12$ | $10$ | |
| $6$ | $14$ | $10$ | |
| $7$ | $16$ | $10$ | |
| $8$ | $18$ | $12$ | |
| $9$ | $19$ | $10$ | |
| $10$ | $20$ | $18$ |
特殊性质 A:每条边至多被一个简单环包含。
时间限制:$\texttt{2s}$
空间限制:$\texttt{512MB}$