1 条题解

  • 0
    @ 2025-11-19 19:41:52

    E66 树形DP P4084 [USACO17DEC] Barn Painting G

    // 树形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);
    }
    
    
    • 1

    E66 树形DP [USACO17DEC] Barn Painting G

    信息

    ID
    6828
    时间
    1000ms
    内存
    128MiB
    难度
    10
    标签
    递交数
    2
    已通过
    2
    上传者