LeetCode 834
题目描述
分析
如果仅仅是求根与每个节点的和,那么其实很简单就是一个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相关推荐
- leetcode 834. Sum of Distances in Tree | 834. 树中距离之和(树形DP)
题目 https://leetcode.com/problems/sum-of-distances-in-tree/ 题解 一般的算法题,指令条数为 10^8 以内是可以通过的.也就是说,如果 arr ...
- LeetCode 834. 树中距离之和(树上DP)*
文章目录 1. 题目 2. 解题 1. 题目 给定一个无向.连通的树.树中有 N 个标记为 0...N-1 的节点以及 N-1 条边 . 第 i 条边连接节点 edges[i][0] 和 edges[ ...
- leetcode 834. 树中距离之和(dp)
给定一个无向.连通的树.树中有 N 个标记为 0...N-1 的节点以及 N-1 条边 .第 i 条边连接节点 edges[i][0] 和 edges[i][1] .返回一个表示节点 i 与其他所有节 ...
- 834. 树中距离之和
834. 树中距离之和 解法一:超时的暴力解法 #include <iostream> #include <vector> #include <string> #i ...
- 天池 在线编程 高效作业处理服务(01背包DP)
文章目录 1. 题目 2. 解题 1. 题目 https://tianchi.aliyun.com/oj/231188302809557697/235445278655844967 Twitter正在 ...
- LeetCode MySQL 1075. 项目员工 I
文章目录 1. 题目 2. 解题 1. 题目 项目表 Project: +-------------+---------+ | Column Name | Type | +-------------+ ...
- leetcode之字母异位词分组
题目描述: 给你一个字符串数组,请你将 字母异位词 组合在一起.可以按任意顺序返回结果列表. 字母异位词 是由重新排列源单词的字母得到的一个新单词,所有源单词中的字母通常恰好只用一次. 示例 1: 输 ...
- [LeetCode]135.Candy
[题目] There are N children standing in a line. Each child is assigned a rating value. You are giving ...
- LeetCode 力扣算法题解汇总,All in One
作者: 负雪明烛 id: fuxuemingzhu 个人博客: https://fuxuemingzhu.cn 关键词:LeetCode,力扣,算法,题解,汇总,解析 把自己刷过的所有题目做一个整理, ...
最新文章
- 10-TypeScript中的接口
- leetcode 412. Fizz Buzz
- android栈和队列
- MIPI related
- Vue 响应式原理(双向数据绑定) 怎样实现 响应式原理?
- Nginx反向代理的使用
- 蓝桥杯第七届国赛JAVA真题----七星填数
- 使用NetronGraphLib类库开发Qfd质量屋编制工具
- 简要说明php数组的类型,php数组的概述及分类与声明代码演示
- mysql ak uk_mysql表的查询
- Linux下CGDB使用教程(转载)
- JS获取指定月的前N个月数据
- 自己动手写操作系统(三)
- 计算机一级要注意什么保存,计算机一级考试重点及注意事项
- 中山联禾科技推出松下PLC以太网数据采集模块
- linux刷wes7,WES7——Win7的嵌入式操作系统
- 拉肚子差评回复模板_吃了拉肚子的差评怎么回复?
- shader 获取法线_Unity Shader-法线贴图(Normal)及其原理
- 【Windows 7错误报告弹出提示窗口怎么取消】
- C/C++读取txt