E72 树形DP P3047 [USACO12FEB] Nearby Cows G

视频链接:E72 树形DP P3047 [USACO12FEB] Nearby Cows G_哔哩哔哩_bilibili

 

 

P3047 [USACO12FEB] Nearby Cows G - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

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

 

posted @ 2024-10-26 12:16  董晓  阅读(92)  评论(0编辑  收藏  举报