小红的树上切割
题号:NC266575
时间限制:C/C++/Rust/Pascal 1秒,其他语言2秒
空间限制:C/C++/Rust/Pascal 256 M,其他语言512 M
64bit IO Format: %lld

题目描述

小红有一棵 n 个点的树,树上部分节点染成了红色,小红想切割一部分边,使得剩下的联通块内,每个联通块都有且仅有一个红色节点,问有多少种切割方案。
例如小红选择切割 k 条边,那么剩下的点就会被分成 k+1 个联通块,如果每个联通块都有且仅有一个红色节点,那么这个方案就是合法的。

输入描述:

第一行一个整数 n,表示树的节点数。
第二行 n 个整数,第 i 个整数 a_i 表示第 i 个节点的颜色,如果 a_i=1,表示第 i 个节点是红色,否则 a_i = 0 表示不是红色。
接下来 n-1 行,每行两个整数 u_i,v_i,表示第 i 条边连接的两个节点。
1 \leq n \leq 10^5
1 \leq u, v \leq n

输出描述:

输出一个整数,表示方案数对 10^9+7 取模的结果。
示例1

输入

复制
5
1 0 1 1 0
1 2
2 3
2 4
4 5

输出

复制
3

说明

(1, 2), (2, 3), (2, 4) 三条边任选两条切割,剩下的联通块内都有且仅有一个红色节点。一共三种方案。