zoukankan      html  css  js  c++  java
  • 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;
        }
    };
    
  • 相关阅读:
    查看端口被占用
    Eclipse导入包
    Eclipse中构造方法自动生成
    Eclipse中get/set方法自动生成
    Eclipse改字体大小
    设计六原则
    类的关系
    JAVA实现多线程下载
    try...catch的前世今生
    447. 回旋镖的数量
  • 原文地址:https://www.cnblogs.com/Crossea/p/13773192.html
Copyright © 2011-2022 走看看