E66 树形DP P4084 [USACO17DEC] Barn Painting G

视频链接:E66 树形DP P4084 [USACO17DEC] Barn Painting G_哔哩哔哩_bilibili

 

 

P4084 [USACO17DEC] Barn Painting G - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

// 树形DP O(n)
#include<bits/stdc++.h>
#define N 200005
using namespace std;

const int M=1e9+7;
int n,m,idx,head[N],ne[N],to[N];
void add(int x,int y){
  to[++idx]=y;ne[idx]=head[x];head[x]=idx;
}
long long f[N][3];

void dfs(int x,int fa){
  if(!(f[x][0]^f[x][1]^f[x][2]))
    f[x][0]=f[x][1]=f[x][2]=1;
    
  for(int i=head[x];i;i=ne[i]){
    int y=to[i];
    if(y==fa)continue;
    dfs(y,x);
    f[x][0]=f[x][0]*((f[y][1]+f[y][2])%M)%M;
    f[x][1]=f[x][1]*((f[y][0]+f[y][2])%M)%M;
    f[x][2]=f[x][2]*((f[y][0]+f[y][1])%M)%M;
  }
}
int main(){
  scanf("%d%d",&n,&m);
  for(int i=1,x,y;i<n;i++)
    scanf("%d%d",&x,&y),add(x,y),add(y,x);
  for(int i=1,x,y;i<=m;i++)
    scanf("%d%d",&x,&y),f[x][y-1]=1;
  dfs(1,0);
  printf("%lld\n",(f[1][0]+f[1][1]+f[1][2])%M);
}

 

posted @ 2024-10-14 12:01  董晓  阅读(51)  评论(0编辑  收藏  举报