• 834. Sum of Distances in Tree —— weekly contest 84


    Sum of Distances in Tree

    An undirected, connected tree with N nodes labelled 0...N-1 and N-1 edges are given.

    The ith edge connects nodes edges[i][0] and edges[i][1] together.

    Return a list ans, where ans[i] is the sum of the distances between node i and all other nodes.

    Example 1:

    Input: N = 6, edges = [[0,1],[0,2],[2,3],[2,4],[2,5]]
    Output: [8,12,6,10,10,10]
    Explanation: 
    Here is a diagram of the given tree:
      0
     / 
    1  2
        /|
      3 4 5
    We can see that dist(0,1) + dist(0,2) + dist(0,3) + dist(0,4) + dist(0,5)
    equals 1 + 1 + 2 + 2 + 2 = 8.  Hence, answer[0] = 8, and so on.
    

    Note: 1 <= N <= 10000

     1 class Solution {
     2 public:
     3     //相当于图来存来处理
     4     vector<vector<int>> tree;
     5     vector<int> res;
     6     vector<int> subc;
     7     int n;
     8     vector<int> sumOfDistancesInTree(int N, vector<vector<int>>& edges) {
     9         //tree.rvec(N,vector<int>(N));
    10         //init
    11         n = N;
    12         tree.resize(N);            //初始化的函数
    13         res.assign(N,0);
    14         subc.assign(N,0);
    15         //build tree
    16         for(auto e : edges){               //遍历的技巧
    17             tree[e[0]].push_back(e[1]);
    18             tree[e[1]].push_back(e[0]);
    19         }
    20         set<int> visited1;
    21         set<int> visited2;
    22         DFS_POST(0,visited1);         //初始root任何值都行
    23         DFS_PRE(0,visited2);
    24         return res;
    25         
    26     }
    27     void DFS_POST(int root,set<int> &visited){            //传引用保存修改值
    28         visited.insert(root);
    29         for(auto i : tree[root]){
    30             if(visited.find(i) == visited.end() ){
    31                 DFS_POST(i,visited);
    32                 subc[root] += subc[i];
    33                 res[root] += res[i] + subc[i];    
    34             }
    35         }
    36         subc[root]++;  //加上自身节点
    37     }
    38     void DFS_PRE(int root,set<int> &visited){
    39         visited.insert(root);
    40         for(auto i : tree[root]){
    41             if(visited.find(i) == visited.end()){
    42                 res[i] = res[root] - subc[i] + n - subc[i];         //算法核心
    43                 DFS_PRE(i,visited);
    44             }
    45         }
    46     }
    47     
    48 };

    主要函数是初始化的函数。

    主要算法思想是先序和后续的递归遍历(DFS)。

    实现O(n2)的算法核心方程是:res[i] = res[root] - subc[i] + n - subc[i]; 

     
  • 相关阅读:
    CentOS部署ElasticSearch7.6.1集群
    Linux安装Elasticsearch7.x
    ElasticSearch安装为Windows服务
    SolrNet Group分组 实现
    ubuntu 下安装sublime
    LeetCode 3: Longest Substring Without Repeating Characters
    LeetCode 179: Largest Number
    LeetCode 1: Two Sum
    LeetCode 190: Reverse Bits
    LeetCode 7: Reverse Integer
  • 原文地址:https://www.cnblogs.com/jinjin-2018/p/9034094.html
Copyright © 2020-2023  润新知