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];

 

最新文章

  1. ssh 登录慢?
  2. HDMI之CEC DDC学习笔记(可能有误)
  3. 禁用CMFCRibbonApplicationButton的单击和双击事件
  4. iOS开发——项目篇—高仿百思不得姐 05——发布界面、发表文字界面、重识 bounds、frame、scrollView
  5. java实现按拼音排序名称
  6. 精通ASP.Net MVC 3 框架(第三版)学习笔记
  7. 运用CMD命令关于快速获取文件夹名称和快速建立文件夹
  8. CSS3秘笈第三版涵盖HTML5学习笔记1~5章
  9. Starting and Stopping Oracle Fusion Middleware
  10. Effective Java提升Code Coverage代码涵盖率 - 就是爱Java
  11. php中的short_open_tag的作用
  12. Linux 下Nginx 的安装及负载均衡的简单配置
  13. SQL查询一个表里面某个字段值相同的数据记录
  14. php 制作圆形图片
  15. Tampermonkey-让百度云下载飞起来
  16. Cucumber使用中问题
  17. JAVAWEB 一一 fmt标签 和日期插件
  18. 记录:Ubuntu 18.04 安装 tensorflow-gpu 版本
  19. MySQL备份与还原详细过程示例
  20. overloading与overriding的区别

热门文章

  1. Layman 使用ffmpeg-php扩展库实现视频截图(默认图)
  2. 如何学习iOS开发?iOS Developer Library足矣!
  3. 040 01 Android 零基础入门 01 Java基础语法 05 Java流程控制之循环结构 02 while循环的执行流程
  4. 二进制K8S集群使用Bootstrap Token 方式增加Node
  5. 通过VNC远程连接Linux实例
  6. 机器学习算法——kNN(k-近邻算法)
  7. TiOps,支持容器,支持多云安全远程运维,疫情期间免费开放,助力远程办公
  8. 自定义 Spring Boot Starter
  9. Nuxt+Vue聊天室|nuxt仿微信App界面|nuxt.js聊天实例
  10. map的key排序