#S0145. 【24NOIP提高组】树的遍历(traverse)
题目描述
小 Q 是一个算法竞赛初学者,正在学习图论知识中的树的遍历。一棵由 个结点, 条边构成的树,初始时所有结点都未被标记,它的遍历过程如下:
- 选择一个结点 作为遍历起始结点,并把该结点打上标记。
- 假设当前访问的结点为 ,寻找任意一个与 相邻且未标记的结点 ,将 作为新的当前访问结点并打上标记。之后再次进入第 2 步。
- 假设在第 2 步中,与 相邻的结点都已被标记,如果 则遍历过程结束,否则将 设为遍历 之前的上一个结点并再进入第 2 步。
例如在下面的树中,一种可能的遍历过程如下:
• 选取 作为遍历起始结点,并把 打上标记;
• 与 相邻且未标记,将 设为当前访问结点,并把 打上标记。
• 与 相邻且未标记,将 设为当前访问结点,并把 打上标记。
• 所有相邻的结点都被标记,将当前访问结点设为遍历结点 之前的结点 。
• 与 相邻且未标记,将 设为当前访问结点,并把 打上标记。
• 所有相邻的结点都被标记,将当前访问结点设为遍历结点 之前的结点 。
• 所有相邻的结点都被标记,将当前访问结点设为遍历结点 之前的结点 。
• 所有相邻的结点都被标记,且 是遍历起始结点,故遍历结束。
作为一个奇思妙想的学生,小 Q 在学习完上述知识后不满足于以结点为基础的遍历方式,于是开始研究以边为基础的遍历方式。定义两条边相邻,当且仅当它们有一个公共的结点。初始时,所有的边都未被标记。这种以边为基础的遍历过程如下: - 选择一条边 作为遍历起始边,并把该边打上标记。
- 假设当前访问边为 ,寻找任意一条与 相邻且未标记的边 ,将 作为新的当前访问边并打上标记。之后再次进入第 2 步。
- 假设在第 2 步中,与 相邻的边都已被标记,如果 则遍历过程结束,否则将 设为遍历 之前的上一条边并再进入第 2 步。
例如在上面的树中,一种可能的遍历过程如下(定义 {, } 表示连接结点 和 的边):
• 选取 {1, 2} 作为遍历起始边,并把 {1, 2} 打上标记;
• {, } 与 {, } 相邻且未标记,将 {, } 设为当前访问边,并把 {, } 打上标记。
• {, } 与 {, } 相邻且未标记,将 {, } 设为当前访问边,并把 {, } 打上标记。
• {, } 所有相邻的边都被标记,将当前访问边设为遍历 {, } 之前的边 {, }。
• {, } 所有相邻的边都被标记,将当前访问边设为遍历 {, } 之前的边 {, }。
• {, } 所有相邻的边都被标记,且 {, } 是遍历起始边,故遍历结束。
小 Q 惊奇的发现,在这个新的树的遍历过程中,如果将每条边看作一个新的结点,将步骤 2 中的所有新结点 和 连接一条新边,就会生成一棵由 个新结点和 条新边连接成的新树。例如上述遍历过程得到的新树如下(新的结点和新边都用红色表示):
现在小 Q 在 条边中选择了 条关键边。小 Q 想知道,以任意一条关键边作为起始遍历边,通过上述遍历过程能够生成多少种不同的新树。这里两棵树被认为是不同的,当且仅当至少存在某一对新的结点,它们仅在其中一棵树中连有新边。
由于结果可能很大,你只需要输出其对 取模的结果即可。
输入
本题有多组测试数据。 输入的第一行包含两个整数 , ,表示测试点的编号和测试数据的组数。在样例中, 表示该样例与测试点 的数据范围相同。 接下来包含 组数据,每组数据的格式如下: • 第一行包含两个整数 , ,表示树的结点数以及小 Q 选择的关键边的数量。 • 接下来 行,第 行包含两个整数 , ,表示树上编号为 的边连接结点 和 。 • 接下来一行包含 个整数 , , . . . ,,表示小 Q 选择的关键边的编号。保证关键边的编号互不相同。
输出
对于每组测试数据输出一行,包含一个整数,表示结果对 取模的结果。
输入样例
1 1
4 1
1 2
2 3
2 4
1
输出样例
2
提示
【样例 1 解释】 两种可能的新树如下: • 新结点 {, } 和新结点 {, } 连新边,新结点 {, } 和新结点 {, } 连新边。 • 新结点 {, } 和新结点 {, } 连新边,新结点 {, } 和新结点 {, } 连新边。 【样例 2 输入】
7 1 5 2 1 2 1 3 2 4 2 5 1 3
【样例 2 输出】
3
【样例 2 解释】 三种可能的新树如下: • 新结点 {, } 和 {, },{, } 和 {, },{, } 和 {, } 之间分别连新边。该新树可以选择 {, } 作为起始遍历边得到。 • 新结点 {, } 和 {, },{, } 和 {, },{, } 和 {, } 之间分别连新边。该新树可以选择 {, } 或 {, } 作为起始遍历边得到。 • 新结点 {, } 和 {, },{, } 和 {, },{, } 和 {, } 之间分别连新边。该新树可以选择 {, } 作为起始遍历边得到。 【数据范围】 对于所有的测试数据,保证: • ; • ; • ; • 对于任意的 (),都有 ,且构成一颗合法的树。 • 对于任意的 (),都有 ,且两两不同。
| 测试点 | n | k | 特殊性质 |
| 1 ∼ 3 | ≤ 5 | ≤ 1 | 无 |
| 4 ∼ 6 | ≤ 105 | ||
| 7 ∼ 10 | ≤ 2 | ||
| 11, 12 | ≤ 500 | ≤ 8 | |
| 13, 14 | ≤ 102 | < n | |
| 15 | ≤ 500 | ||
| 16, 17 | ≤ 105 | ≤ 500 | |
| 18 | < n | A | |
| 19 ∼ 21 | B | ||
| 22, 23 | ≤ 2 × 104 | 无 | |
| 24, 25 | ≤ 105 |
评测数据说明
本题使用按题意独立构造、以独立程序核对的训练数据及公开样例,共7个测试点,非原站或官方原始数据。总分100分。