#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll maxN = 1e5 + 5, maxc = 6, p = 1e9 + 7;
ll N, K, x, y, col[maxN], b, c, dp[maxN][maxc], ans;
vector <ll> e[maxN];
void dfs(ll x, ll f) {
if (col[x]) {
dp[x][col[x]] = 1;
}
else {
dp[x][1] = dp[x][2] = dp[x][3] = 1;
}
for (ll i = 0; i < e[x].size(); ++i) {
ll nex = e[x][i];
if (nex == f) {
continue;
}
dfs(nex, x);
dp[x][1] *= (((dp[nex][2] + dp[nex][3]) % p) % p);
dp[x][2] *= (((dp[nex][1] + dp[nex][3]) % p) % p);
dp[x][3] *= (((dp[nex][1] + dp[nex][2]) % p) % p);
}
return ;
}
int main(void) {
scanf("%lld %lld", &N, &K);
for (ll i = 1; i < N; ++i) {
scanf("%lld %lld", &x, &y);
e[x].push_back(y);
e[y].push_back(x);
}
for (ll i = 1; i <= K; ++i) {
scanf("%lld %lld", &b, &c);
col[b] = c;
}
dfs(1, 0);
ans = max(dp[1][1], max(dp[1][2], dp[1][3])) % p;
printf("%lld", ans);
return 0;
}
思路和题解差不多,but why?