文章目录

  • 1. 题目
  • 2. 解题

1. 题目

给定一个无向、连通的树。树中有 N 个标记为 0...N-1 的节点以及 N-1 条边 。

第 i 条边连接节点 edges[i][0]edges[i][1]

返回一个表示节点 i 与其他所有节点距离之和的列表 ans。

示例 1:
输入: N = 6, edges = [[0,1],[0,2],[2,3],[2,4],[2,5]]
输出: [8,12,6,10,10,10]
解释:
如下为给定的树的示意图:0/ \
1   2/|\3 4 5我们可以计算出
dist(0,1) + dist(0,2) + dist(0,3) + dist(0,4) + dist(0,5)
也就是 1 + 1 + 2 + 2 + 2 = 8。
因此,answer[0] = 8,以此类推。
说明: 1 <= N <= 10000

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/sum-of-distances-in-tree
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

2. 解题

  • 抄的官方答案
class Solution {vector<int> ans, son, dp;vector<vector<int>> g;
public:vector<int> sumOfDistancesInTree(int N, vector<vector<int>>& edges) {ans.resize(N);son.resize(N);dp.resize(N);g.resize(N);for(auto& e : edges){g[e[0]].push_back(e[1]);g[e[1]].push_back(e[0]);}dfs1(0, -1);//dp 初始化dfs2(0, -1);//dp 递推return ans;}void dfs1(int u, int f){    //求子树包含的节点数量// 第一次dfs 得到的每个节点子树节点到该节点的距离和son[u] = 1;dp[u] = 0;for(auto v : g[u]){if(v == f)continue;dfs1(v, u);dp[u] += dp[v]+son[v];//子节点的距离和 + 边被占用次数son[u] += son[v];}}void dfs2(int u, int f){ans[u] = dp[u];for(auto v : g[u]){if(v == f)continue;int dpu = dp[u], dpv = dp[v];//记录状态int sonu = son[u], sonv = son[v];dp[u] -= dp[v]+son[v];//跟换根节点为 v ,u 变成子节点son[u] -= son[v];dp[v] += dp[u]+son[u];// v 加上 u 的数据son[v] += son[u];dfs2(v, u);dp[u] = dpu, dp[v] = dpv;//回溯状态son[u] = sonu, son[v] = sonv;}}
};

148 ms 26.4 MB


我的CSDN博客地址 https://michael.blog.csdn.net/

长按或扫码关注我的公众号(Michael阿明),一起加油、一起学习进步!

LeetCode 834. 树中距离之和(树上DP)*相关推荐

  1. leetcode 834. 树中距离之和(dp)

    给定一个无向.连通的树.树中有 N 个标记为 0...N-1 的节点以及 N-1 条边 .第 i 条边连接节点 edges[i][0] 和 edges[i][1] .返回一个表示节点 i 与其他所有节 ...

  2. 834. 树中距离之和

    834. 树中距离之和 解法一:超时的暴力解法 #include <iostream> #include <vector> #include <string> #i ...

  3. 834 树中距离之和

    这道题我自己的想法只有对每个点都用一遍Dijkstra然后再求和,显然会超时,所以我都没有尝试. 研究了一下题解,发现题解很巧妙,自己对树的处理还是太稚嫩,之前树链剖分学的都忘光了. 对于固定根节点的 ...

  4. leetcode 834. Sum of Distances in Tree | 834. 树中距离之和(树形DP)

    题目 https://leetcode.com/problems/sum-of-distances-in-tree/ 题解 一般的算法题,指令条数为 10^8 以内是可以通过的.也就是说,如果 arr ...

  5. 树形动态规划 - 树中距离之和

    题目链接 换根dp 首先dfs记录每个节点到左右子节点的距离和sum,和子节点个数cnt. 已知父节点的(sum,cnt)如何向子节点转移? 假设当前节点的信息为(sum,cnt),父节点的信息为(F ...

  6. 2019长安大学ACM校赛网络同步赛C LaTale (树上DP)

    链接:https://ac.nowcoder.com/acm/contest/897/C 来源:牛客网 LaTale 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/C++ 32768K,其他 ...

  7. 算法提高——树上DP(树的直径)

    文章目录 前言 一.什么是树的直径? 二.例题 三.树上DP 总结 前言 树的直径是图论里边非常高的考察点并且是入门树形dp的基础,竞赛的同学务必重视. 一.什么是树的直径? 树上最远两点(叶子结点) ...

  8. 【ZJOI2019】线段树【线段树上dp】【大讨论】

    题意:有一个 [1,n][1,n][1,n] 的线段树和 mmm 个区间赋值操作,求任取一个操作的子集并按顺序在线段树上跑后线段树上有 lazy 标记的点的个数之和 模 998244353998244 ...

  9. 牛客网CSP-S提高组赛前集训营1题解(仓鼠的石子游戏 [博弈论] + 乃爱与城市的拥挤程度 [树上DP] + 小w的魔术扑克[dfs + 离线])

    文章目录 T1:仓鼠的石子游戏 题目 题解 代码实现 T2:乃爱与城市拥挤程度 题目 题解 代码实现 T3:小w的魔术扑克 题目 题解 代码实现 T1:仓鼠的石子游戏 题目 仓鼠和兔子被禁止玩电脑,无 ...

最新文章

  1. 扩增子图表解读7三元图:三组差异数量和关系
  2. 计算机科学与技术与cs,CSgo! | 遇见CS—带你走进传说中的计算机专业
  3. 面试题:找两个有序数组所有数第K小的数
  4. linux6安装图形化界面,centos 6.8 图形界面安装
  5. java lambda map用法_Java 中如何使用 lambda 表达式填充 Map?
  6. 全局变量定义的时候左侧加了static_c语言中static 用法
  7. 《『若水新闻』客户端开发教程》——19.自定义TextView(2)
  8. 虚拟机安装Centos 7网上教程整合
  9. win7怎么跳过硬盘自检_从零开始修电脑第二期__电脑自检慢的维修
  10. 冰点还原忘记密码怎样删除?
  11. 为什么普通人做量化交易会亏钱?
  12. cl.moqy.pw index.php_index2.php
  13. GitHub设置代理 提升速度
  14. 服务器pcb维修方法,电路板维修的方法与口诀
  15. 有什么软件可以把PDF文件转jpg?推荐这3款软件给你
  16. python实现关联算法_【原创】利用python实现apriori关联算法并分析挖掘数据
  17. C++ qsort用法
  18. 曾仕强经典语录-《易经的智慧》
  19. python导入上级目录_Python导入上一级/下一级/任一级目录下的.py文件问题
  20. javaWeb新闻发布展示(分页)

热门文章

  1. listview 每行后面的小箭头_主卧带小衣帽装修,这几个装修方案,你喜欢哪个?...
  2. 细粒度权限控制 linux,利用docker插件实现细粒度权限控制
  3. 编码 括号_Java编码规范整理汇总
  4. input中的disabled 和 readonly的区别
  5. salesforce 零基础学习(五十四)常见异常友好消息提示
  6. [JZOJ P1288] [DP]矩阵取数
  7. 【代码笔记】iOS-UILable电子表显示
  8. poj1284:欧拉函数+原根
  9. 域名状态:运营商设置了客户禁止删除保护?过期域名也不能注册为什么?
  10. JSON数据格式以及与后台交互数据转换实例