#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$。

算法的流程描述如下:

  1. 将栈 $S$ 设置为空,并令 $T = (V, \varnothing)$,即 $T$ 的边集初始为空。
  2. 首先将出发点 $s$ 压入 $S$ 中。
  3. 访问栈顶节点 $u$,并将 $u$ 标记为“已访问的”。
  4. 如果存在与 $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}$