2538. 最大价值和与最小价值和的差值
题目描述
给你一个 n 个节点的无向无根图,节点编号为 0 到 n - 1 。给你一个整数 n 和一个长度为 n - 1 的二维整数数组 edges ,其中 edges[i] = [ai, bi] 表示树中节点 ai 和 bi 之间有一条边。
每个节点都有一个价值。给你一个整数数组 price ,其中 price[i] 是第 i 个节点的价值。
一条路径的 价值和 是这条路径上所有节点的价值之和。
你可以选择树中任意一个节点作为根节点 root 。选择 root 为根的 开销 是以 root 为起点的所有路径中,价值和 最大的一条路径与最小的一条路径的差值。
请你返回所有节点作为根节点的选择中,最大 的 开销 为多少。
示例 1:
输入:n = 6, edges = [[0,1],[1,2],[1,3],[3,4],[3,5]], price = [9,8,7,6,10,5] 输出:24 解释:上图展示了以节点 2 为根的树。左图(红色的节点)是最大价值和路径,右图(蓝色的节点)是最小价值和路径。 - 第一条路径节点为 [2,1,3,4]:价值为 [7,8,6,10] ,价值和为 31 。 - 第二条路径节点为 [2] ,价值为 [7] 。 最大路径和与最小路径和的差值为 24 。24 是所有方案中的最大开销。
示例 2:
输入:n = 3, edges = [[0,1],[1,2]], price = [1,1,1] 输出:2 解释:上图展示了以节点 0 为根的树。左图(红色的节点)是最大价值和路径,右图(蓝色的节点)是最小价值和路径。 - 第一条路径包含节点 [0,1,2]:价值为 [1,1,1] ,价值和为 3 。 - 第二条路径节点为 [0] ,价值为 [1] 。 最大路径和与最小路径和的差值为 2 。2 是所有方案中的最大开销。
提示:
1 <= n <= 105edges.length == n - 10 <= ai, bi <= n - 1edges表示一棵符合题面要求的树。price.length == n1 <= price[i] <= 105
解法
方法一:树形 DP
思考
树上一条路径的代价是点权和减去两个端点中的较小者,求所有路径的最大代价。价格均为正,较小端点总是路径上较矮的一端,等价于“整条路径和减去一个端点”。枚举所有路径需 \(O(n^2)\)。
树形 DP 对每个子树维护两条量:从根出发不删端点的最长链 \(a\),以及删去远端端点的最长链 \(b\)。跨过当前结点时,一侧取 \(a\) 另一侧取对方的 \(d\)(已删端点),或一侧取 \(b\) 另一侧取对方的 \(c\),即可拼出经过该结点的最优路径。
由于每个节点价值均为正整数,因此,以节点 \(root\) 作为根节点的最小的一条路径就是 \(root\) 节点本身,那么价值和最大的一条路径与最小的一条路径的差值就等价于去掉路径的一个端点。
我们设计一个函数 \(dfs(i, fa)\),表示以节点 \(i\) 为根节点的子树中,不去掉端点的最大路径和以及去掉端点的最大路径和。其中,\(fa\) 表示节点 \(i\) 的父节点。
函数 \(dfs(i, fa)\) 的实现逻辑如下:
初始化 \(a = price[i]\), \(b = 0\),表示初始只有一个节点,不去掉端点的最大路径和为 \(price[i]\),去掉端点的最大路径和为 \(0\)。
对于节点 \(i\) 的每个子节点 \(j\),如果 \(j \ne fa\),则递归调用函数 \(dfs(j, i)\),这里返回了以节点 \(j\) 为根节点的子树中,不去掉端点的最大路径和以及去掉端点的最大路径和,记为 \(c\) 和 \(d\)。此时答案有两种情况:
- 前面不去掉端点的最大路径和加上当前节点去掉端点的最大路径和,即 \(a + d\);
- 前面去掉端点的最大路径和加上当前节点不去掉端点的最大路径和,即 \(b + c\)。
我们更新答案的最大值,即 \(ans = \max(ans, a + d, b + c)\)。
然后更新 \(a\) 和 \(b\),即 \(a = \max(a, price[i] + c)\), \(b = \max(b, price[i] + d)\),最后返回。
时间复杂度为 \(O(n)\),空间复杂度为 \(O(n)\)。其中 \(n\) 为节点个数。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | |

