#3672. 深度优先搜索 (dfs)

深度优先搜索 (dfs)

题目描述

有份 dfs 的代码:

void dfs(int u) {
    vis[u] = true;
    for (int v = 1; v <= n; v++)
        if (g[u][v] == true && vis[v] == false)
            dfs(v), link(u, v);
}

这个代码表示对一个点数为 nn 的无向连通图进行遍历。

其中 g[u][v]g[u][v] 是一个布尔数组,如果图有边 (u,v)(u,v)g[u][v]=g[v][u]=trueg[u][v] = g[v][u] = \text{true},否则 g[u][v]=g[v][u]=falseg[u][v] = g[v][u] = \text{false}。特别地,对于任意的 1un1 \leq u \leq n 都有 g[u][u]=falseg[u][u] = \text{false}

link(x,y)\text{link}(x,y) 表示在另一个点数为 nn 的图 TT 上连边 (x,y)(x,y)。注意,初始时 TT 中只有 nn 个点而没有任何边。容易得到,执行 dfs(1)\text{dfs}(1) 之后 TT 将会是一棵树。

求对于给定的树 TT,有多少个没有重边和自环的无向连通图 GG 满足对 GG 执行 dfs(1)\text{dfs}(1) 之后得到的树 TT 与给定的树完全一样?

两个图完全一样,当且仅当这两个图的节点数相同并且对于第一个图的任意一条边 (u,v)(u,v),第二个图中都有边 (u,v)(u,v) 存在。

输入格式

在文件 dfs.in 中读入。

第一行一个正整数 nn,表示树 TT 的点数,也是无向连通图的点数。

接下来的 n1n - 1 行,每行两个正整数 u,vu,v,表示树 TT 上有边 (u,v)(u,v)

输出格式

在文件 dfs.out 中输出。

输出一个整数表示答案。由于答案可能很大,你只要输出其对 109+710^9 + 7 取模后的结果。

样例

样例输入 #1

5
1 2
1 3
2 4
2 5

样例输出 #1

4

样例 1 解释

下面这张图是一个合法的图 GG,加粗的边即为执行了 dfs(1) 后得到的树 TT

样例一解释

样例输入 #2

8
1 2
1 3
2 4
2 5
1 7
6 7
8 6

样例输出 #2

16

大样例

数据范围

  • 对于前 20%20\% 的数据,n7n \le 7
  • 对于前 60%60\% 的数据,n5×103n \le 5 \times 10^3
  • 对于所有数据,n2×105n \le 2 \times 10^5