
简单换根DP
其实就是看好变化量,然后让父亲更新儿子就好了~
上图2当根节点的时候,ans[2] = ans[0] -sz[2]+n-sz[2];
class Solution {
public:
    vector<int> sumOfDistancesInTree(int n, vector<vector<int>>& edges) {
        vector<vector<int>>g(n);
        for(auto &edge:edges){
            int a = edge[0],b = edge[1];
            g[a].push_back(b),g[b].push_back(a);
        }
        using ll = long long;
        vector<int>ans(n);
        vector<ll>sz(n+10);
        function<void(int,int,int)>dfs=[&](int u,int father,int dist){
            sz[u] = 1;
            ans[0]+=dist;
            for(auto &v:g[u]){
                if(v==father)continue;
                dfs(v,u,dist+1);
                sz[u]+=sz[v];
            }
        };
        function<void(int,int)>down=[&](int u,int father){
            for(auto &v:g[u]){
                if(v==father)continue;
                ans[v] = ans[u]-sz[v]+n-sz[v];
                down(v,u);
            }
        };
        dfs(0,-1,0);
        down(0,-1);
        return ans;
    }
};


















