1 条题解

  • 0
    @ 2025-11-19 16:21:50

    E72 树形DP P3047 USACO12FEB Nearby Cows G

    // 换根DP O(nk)
    #include <iostream>
    #include <cstring>
    #include <algorithm>
    using namespace std;
    int read(){
      int x=0,f=1;char c=getchar();
      while(!isdigit(c)){if(c=='-')f=-1;c=getchar();}
      while(isdigit(c)){x=x*10+c-'0';c=getchar();}
      return x*f;
    }
    
    #define N 100005
    int idx,head[N];
    struct E{int to,ne;}e[N<<1];
    void add(int x,int y){
      e[++idx]={y,head[x]};head[x]=idx;
    }
    int n,k,w[N];
    int f[N][25];
    
    void dfs(int u,int fa){
      for(int i=0;i<=k;i++)f[u][i]=w[u];
      for(int i=head[u];i;i=e[i].ne){
        int v=e[i].to;
        if(v==fa)continue;
        dfs(v,u);
        for(int i=1;i<=k;i++)
          f[u][i]+=f[v][i-1];
      }
    }
    void dfs2(int u,int fa){
      for(int i=head[u];i;i=e[i].ne){
        int v=e[i].to;
        if(v==fa)continue;
        for(int i=k;i>=2;i--)
          f[v][i]+=f[u][i-1]-f[v][i-2];
        f[v][1]+=f[u][0];  
        dfs2(v,u);
      }
    }
    int main(){
      n=read(),k=read();
      for(int i=1,x,y;i<n;i++){
        x=read(),y=read();
        add(x,y);add(y,x);
      }
      for(int i=1;i<=n;i++) w[i]=read();
      dfs(1,0);
      dfs2(1,0);
      for(int i=1;i<=n;i++)
        printf("%d\n",f[i][k]);
    }
    
    • 1

    信息

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