Leetcode 834. 树中距离之和

可以发现,当当前节点由上一个节点转移过来的时候
当前节点以及它的子节点对当前节点的距离和的贡献
相对上一个节点都减小了1
其余节点对这个点的贡献相对上一个节点的距离增加了1
于是当前节点的距离和就是上一个节点的距离和加上 n-son[cur]-2

class Solution {
public:
    vector<int> ans;
    vector<int> son;
    vector<vector<int> > G;
    int n;
    int dfs1(int cur, int fa, int dis){
        ans[0] += dis;
        for(auto e: G[cur]){
            if(e==fa)
                continue;
            son[cur] += dfs1(e, cur, dis+1);
        }
        return son[cur]+1;
    }
    void dfs2(int cur, int fa){
        if(fa!=-1){
            ans[cur] = ans[fa]-2*son[cur]+n-2;
        }

        for(auto e:G[cur]){
            if(e==fa)
                continue;
            dfs2(e, cur);
        }
    }
    vector<int> sumOfDistancesInTree(int N, vector<vector<int>>& edges) {
        G = vector<vector<int> >(N);
        for(auto e:edges){
            G[e[0]].push_back(e[1]);
            G[e[1]].push_back(e[0]);
        }
        ans = vector<int> (N, 0);
        son = vector<int> (N, 0);
        n = N;
        dfs1(0, -1, 0);
        dfs2(0, -1);
        return ans;
    }
};
posted @ 2020-10-06 13:17  CrosseaLL  阅读(89)  评论(0编辑  收藏  举报