RT,谢谢
#include <bits/stdc++.h>
using namespace std;
const int maxn = 100000+5;
const int mod=10e9+7;
vector <int> tree[maxn];
int n,k,f[maxn][4],flag[maxn];
bool vis[maxn];
void dp(int x){
for(int i=0;i<tree[x].size();i++){
int now=tree[x][i];
if(!vis[now]){
vis[now]=1;
dp(now);
f[now][1]=(f[now][1]*(f[x][2]+f[x][3])%mod)%mod;
f[now][2]=(f[now][2]*(f[x][1]+f[x][3])%mod)%mod;
f[now][3]=(f[now][3]*(f[x][1]+f[x][2])%mod)%mod;
}
}
}
int main() {
scanf("%d%d",&n,&k);
for(int i=1;i<n;i++){
int u,v;
scanf("%d%d",&u,&v);
tree[u].push_back(v);
tree[v].push_back(u);
}
for(int i=1;i<=k;i++){
int u,x;
scanf("%d%d",&u,&x);
flag[u]=x;
}
for(int i=1;i<=n;i++){
if(!flag[i])f[i][1]=f[i][2]=f[i][3]=1;
else f[i][flag[i]]=1;
}
dp(1);
printf("%d",(f[1][1]+f[1][2]+f[1][3])%mod);
return 0;
}