Rerooting

fn dfs(
    u: usize,
    p: usize,
    d: usize,
    dep: &mut Vec<usize>,
    sum: &mut Vec<i64>,
    adj: &Vec<Vec<usize>>,
    c: &Vec<i64>,
) {
    dep[u] = d;
    sum[u] = c[u];
    for v in adj[u].iter() {
        if *v != p {
            dfs(*v, u, d + 1, dep, sum, adj, c);
            sum[u] += sum[*v];
        }
    }
}

fn rec(
    u: usize,
    p: usize,
    dp: &mut Vec<i64>,
    sum: &Vec<i64>,
    adj: &Vec<Vec<usize>>,
    c: &Vec<i64>,
    total: i64,
) {
    if u > 0 {
        dp[u] = dp[p];
        dp[u] -= sum[u] + c[u]; // bottom
        dp[u] += total - sum[u] + c[u]; // top
    }
    for v in adj[u].iter() {
        if *v != p {
            rec(*v, u, dp, sum, adj, c, total);
        }
    }
}

ABC348E Typical90-039