10分求助
查看原帖
10分求助
921234
CRL_crl楼主2023/11/4 17:09
#include <bits/stdc++.h>
#define int long long
const int N = 1e6 + 10;
using namespace std;
int n,k,head[N],to[N],ne[N],id,dep[N],c[N],dp[N][22],ans;
void add(int x,int y){
    to[++id] = y,ne[id] = head[x],head[x] = id;
}
void dfs(int u,int fa){
    for(int i =head[u];i;i = ne[i]){
        int v = to[i];
        if(v == fa)
            continue;
        dfs(v,u);
        for(int j = 1;j <= k;j++)
            dp[u][j]+=dp[v][j-1];
    }
}
void dfs2(int u,int fa){
    for(int i = head[u];i;i = ne[i]){
        int v = to[i];
        if(v == fa)
            continue;
        for(int j = k;j >= 2;j--)
            dp[v][j] -= dp[v][j-2];
        for(int j = 1;j <= k;j++)
            dp[v][j] += dp[u][j-1];
        dfs2(v,u);
    }
}
signed main(){
    int n,k;
    cin >> n >> k;
    for(int i = 1,x,y;i < n;i++){
        cin >> x >> y;
        add(x,y),add(y,x);
    }
    for(int i = 1;i <= n;i++){
        cin >> c[i];
        dp[i][0] = c[i];
    }
    dfs(1,0);
    dfs2(1,1);
    for(int i = 1;i <= n;i++){
        ans=0;
        for(int j = 0;j <= k;j++)
            ans += dp[i][j];
        cout << ans << endl;
    }
    return 0;
}
2023/11/4 17:09
加载中...