深度优先搜索是一种常见的搜索算法。通过此算法,我们可以从一个无重边、无自环的无向连通图
算法的流程描述如下:
- 将栈
设置为空,并令 ,即 的边集初始为空。 - 首先将出发点
压入 中。 - 访问栈顶节点
,并将 标记为“已访问的”。 - 如果存在与
相邻且未被访问的节点,则任意地从这些节点中挑选一个记为 。我们将边 加入 的边集中,并将 压入栈 中,然后回到步骤3。若不存在这样的节点,则从栈中弹出节点 。
可以证明,当图
现在给定一棵
现在你想知道,有多少种选取这
由于答案可能十分巨大,你只需要输出方案数在模
输入格式
输入的第一行包含一个整数
输入的第二行包含三个正整数
接下来
接下来
输入的最后一行包含
输出格式
输出一行包含一个非负整数,表示方案数在模
样例一
input
0 4 2 2 1 2 2 3 3 4 1 3 2 4 2 3
output
3
explanation
在这个样例中,有三种选取非树边的方法:只选取边 (1, 3),只选取边 (2, 4),或不 选取任何一条非树边。
如果只选取边 (1, 3),或者不选取任何一条非树边,则我们发现 T 都是图 G 的 3-dfs 树。指定的搜索顺序如下:
- 将 3 放入栈 S 中。此时 S = [3]。
- 将 3 标记为“已访问的”。
- 由于 3 与 2 相连,且 2 是“未访问的”,将 2 放入栈 S 中,并将 (3, 2) 加入树 T 中,此时 S = [3, 2]。
- 将 2 标记为“已访问的”。
- 由于 2 与 1 相连,且 1 是“未访问的”,将 1 放入栈 S 中,并将 (2, 1) 加入树 T 中,此时 S = [3, 2, 1]。
- 由于与 1 相邻的点都是“已访问的”,将 1 弹出栈,此时 S = [3, 2]。
- 由于与 2 相邻的点都是“已访问的”,将 2 弹出栈,此时 S = [3]。
- 由于 3 与 4 相连,且 4 是“未访问的”,将 4 放入栈 S 中,并将 (3, 4) 加入树 T 中,此时 S = [3, 4]。
- 由于与 4 相连的点都是“已访问的”,将 4 弹出栈,此时 S = [3]。
- 由于与 3 相连的点都是“已访问的”,将 3 弹出栈,此时 S 重新变为空。
如果只选取边 (2, 4),则我们可以说明 T 是图 G 的 2-dfs 树。指定的搜索顺序如下:
- 将 2 放入栈 S 中。此时 S = [2]。
- 将 2 标记为“已访问的”。
- 由于 2 与 3 相连,且 3 是“未访问的”,将 3 放入栈 S 中,并将 (2 3) 加入树 T 中,此时 S = [2, 3]。
- 将 3 标记为“已访问的”。
- 由于 3 与 4 相连,且 4 是“未访问的”,将 4 放入栈 S 中,并将 (3, 4) 加入树 T 中,此时 S = [2, 3, 4]。
- 由于与 4 相邻的点都是“已访问的”,将 4 弹出栈,此时 S = [2, 3]。
- 由于与 3 相邻的点都是“已访问的”,将 3 弹出栈,此时 S = [2]。
- 由于 2 与 1 相连,且 1 是“未访问的”,将 1 放入栈 S 中,并将 (2, 1) 加入树 T 中,此时 S = [2, 1]。
- 由于与 1 相连的点都是“已访问的”,将 1 弹出栈,此时 S = [2]。
- 由于与 2 相连的点都是“已访问的”,将 2 弹出栈,此时 S 重新变为空。
样例二
见附件下载。
这个样例满足测试点
样例三
见附件下载。
这个样例满足测试点
样例四
见附件下载。
这个样例满足测试点
样例五
见附件下载。
这个样例满足测试点
样例六
见附件下载。
这个样例满足测试点
数据范围
对于所有测试数据保证:
测试点编号 | 特殊性质 | |||
---|---|---|---|---|
无 | ||||
无 | ||||
无 | ||||
特殊性质
特殊性质
请注意,
时间限制:2s
空间限制: