题目描述

分析

如果仅仅是求根与每个节点的和,那么其实很简单就是一个dp:
dp[u]=∑v(dp[v]+siz[v])dp[u]=\sum_{v }(dp[v]+siz[v]) dp[u]=v∑​(dp[v]+siz[v])
这里的siz代表以这个节点为根的子树节点个数。为啥要加他,其实也很容易推导。该节点有多少个子节点,那么他和他的父亲连接的边就要被走多少次。然后这里其实只是求出了根节点的值,那么其他节点呢?
考虑换根操作,首先把根节点的儿子换成父亲。其实有点类似与AVL树的旋转,旋转之后变换公式:

然后递归这个操作,尝试把所有根都换一遍。其实就是尝试把根节点推移。

代码

class Solution {vector<int>g[2000];vector<int>ans;int dp[2000];int siz[2000];
public:vector<int> sumOfDistancesInTree(int N, vector<vector<int>>& edges) {buildG(edges);ans.resize(N);dfs1(0, -1);dfs2(0, -1);return ans; }void dfs1(int u, int f) {siz[u] = 1;dp[u] = 0;for (auto v : g[u]) {if (v == f)continue;dfs1(v, u);dp[u] += (dp[v] + siz[v]);siz[u] += siz[v];}}void dfs2(int u, int f) {ans[u] = dp[u];for (int v : g[u]) {if (v == f)continue;int preu = dp[u], prev = dp[v];int presu = siz[u], presv = siz[v];// 换根操作 把u换成v的儿子dp[u] = dp[u] - (dp[v] + siz[v]);siz[u]-=siz[v];dp[v] = dp[v] + (dp[u] + siz[u]);siz[v] += siz[u];dfs2(v, u);// 恢复dp[u] = preu, dp[v] = prev, siz[u] = presu, siz[v] = presv;}}void buildG(vector<vector<int>>edges) {for (auto e : edges) {g[e[0]].push_back(e[1]);g[e[1]].push_back(e[0]);}}
};

LeetCode 834相关推荐

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

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

  2. LeetCode 834. 树中距离之和(树上DP)*

    文章目录 1. 题目 2. 解题 1. 题目 给定一个无向.连通的树.树中有 N 个标记为 0...N-1 的节点以及 N-1 条边 . 第 i 条边连接节点 edges[i][0] 和 edges[ ...

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

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

  4. 834. 树中距离之和

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

  5. 天池 在线编程 高效作业处理服务(01背包DP)

    文章目录 1. 题目 2. 解题 1. 题目 https://tianchi.aliyun.com/oj/231188302809557697/235445278655844967 Twitter正在 ...

  6. LeetCode MySQL 1075. 项目员工 I

    文章目录 1. 题目 2. 解题 1. 题目 项目表 Project: +-------------+---------+ | Column Name | Type | +-------------+ ...

  7. leetcode之字母异位词分组

    题目描述: 给你一个字符串数组,请你将 字母异位词 组合在一起.可以按任意顺序返回结果列表. 字母异位词 是由重新排列源单词的字母得到的一个新单词,所有源单词中的字母通常恰好只用一次. 示例 1: 输 ...

  8. [LeetCode]135.Candy

    [题目] There are N children standing in a line. Each child is assigned a rating value. You are giving ...

  9. LeetCode 力扣算法题解汇总,All in One

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: https://fuxuemingzhu.cn 关键词:LeetCode,力扣,算法,题解,汇总,解析 把自己刷过的所有题目做一个整理, ...

最新文章

  1. 10-TypeScript中的接口
  2. leetcode 412. Fizz Buzz
  3. android栈和队列
  4. MIPI related
  5. Vue 响应式原理(双向数据绑定) 怎样实现 响应式原理?
  6. Nginx反向代理的使用
  7. 蓝桥杯第七届国赛JAVA真题----七星填数
  8. 使用NetronGraphLib类库开发Qfd质量屋编制工具
  9. 简要说明php数组的类型,php数组的概述及分类与声明代码演示
  10. mysql ak uk_mysql表的查询
  11. Linux下CGDB使用教程(转载)
  12. JS获取指定月的前N个月数据
  13. 自己动手写操作系统(三)
  14. 计算机一级要注意什么保存,计算机一级考试重点及注意事项
  15. 中山联禾科技推出松下PLC以太网数据采集模块
  16. linux刷wes7,WES7——Win7的嵌入式操作系统
  17. 拉肚子差评回复模板_吃了拉肚子的差评怎么回复?
  18. shader 获取法线_Unity Shader-法线贴图(Normal)及其原理
  19. 【Windows 7错误报告弹出提示窗口怎么取消】
  20. C/C++读取txt

热门文章

  1. cgb2105-day02
  2. zigbee终端入网
  3. 音视频篇 - FFmpeg 的介绍和使用
  4. html怎么打五角星符号怎么打,五角星符号怎么打,五角星符号大全
  5. php编辑菱形图案代码,打印菱形图案 (15 分)
  6. 【Unity3D】协同程序
  7. Unity 绘制弹球和台球的运动轨迹
  8. 豆瓣读书top250数据爬取与可视化
  9. QDataStream类的官方简介
  10. 【活动预告】说说对 Coding 新一年的期许, Filco 蓝牙无线机械键盘等你拿!