Skip to content

2285. 道路的最大总重要性

题目

给你一个整数 n ,表示一个国家里的城市数目。城市编号为 0n - 1

给你一个二维整数数组 roads ,其中 roads[i] = [ai, bi] 表示城市 aibi 之间有一条 双向 道路。

你需要给每个城市安排一个从 1n 之间的整数值,且每个值只能被使用 一次 。道路的 重要性 定义为这条道路连接的两座城市数值 之和

请你返回在最优安排下,所有道路重要性 之和 最大 为多少。

示例 1:

20240121204542

输入:n = 5, roads = [[0,1],[1,2],[2,3],[0,2],[1,3],[2,4]]
输出:43
解释:上图展示了国家图和每个城市被安排的值 [2,4,5,3,1] 。
- 道路 (0,1) 重要性为 2 + 4 = 6 。
- 道路 (1,2) 重要性为 4 + 5 = 9 。
- 道路 (2,3) 重要性为 5 + 3 = 8 。
- 道路 (0,2) 重要性为 2 + 5 = 7 。
- 道路 (1,3) 重要性为 4 + 3 = 7 。
- 道路 (2,4) 重要性为 5 + 1 = 6 。
所有道路重要性之和为 6 + 9 + 8 + 7 + 7 + 6 = 43 。
可以证明,重要性之和不可能超过 43 。

示例 2:

20240121204536

输入:n = 5, roads = [[0,3],[2,4],[1,3]]
输出:20
解释:上图展示了国家图和每个城市被安排的值 [4,3,2,5,1] 。
- 道路 (0,3) 重要性为 4 + 5 = 9 。
- 道路 (2,4) 重要性为 2 + 1 = 3 。
- 道路 (1,3) 重要性为 3 + 5 = 8 。
所有道路重要性之和为 9 + 3 + 8 = 20 。
可以证明,重要性之和不可能超过 20 。

提示:

  • 2 <= n <= 5 * 10^4
  • 1 <= roads.length <= 5 * 10^4
  • roads[i].length == 2
  • 0 <= ai, bi <= n - 1
  • ai != bi
  • 没有重复道路。

解答

思路

考虑每个点对重要性的贡献,设点 i 的度数为 degi,权重为 pi,因此所有道路的重要性之和为:

indegi×pi

由于 deg[i] 实际上是从 roads[] 中可以求出的固定数组,p[i] 是从 1n 的数,这是可以自己设计的。因此根据 排序不等式 可知,最大的是顺序和:

排序不等式

如果 a1a2anb1b2bn 是两组实数,而 aσ(1),aσ(2),aσ(n)a1,a2,,an 的一个随机排列。排序不等式指出:

a1b1++anbnaσ(1)b1++aσ(n)bnanb1++a1bn

证明

首先我们知道,若 xixj,yiyj,则有:

(xjxi)(yjyi)0

将上式展开并且移项得到:

xiyi+xjyjxjyi+xiyj

我们设 Si 为原序列 b1,b2,,bn 的前 i 个数的和,即:

Si=b1+b2++bi

Si 为打乱顺序后的排列 bσ(1),bσ(2),bσ(n) 的前 i 个数的和,由于 b1b2bn,所以 Si 也是序列最小的 i 个数之和。因此有 SiSi。这里设 S0=0

注意到:

k=1nakbk=k=1nak(SkSk1)=k=1n1Sk(akak+1)+Snan

同时:

k=1nakbσ(k)=k=1nak(SkSk1)=k=1n1Sk(akak+1)+Snan(Sn=Sn)

注意到 aiai+10,则 Si(aiai+1)Si(aiai+1),因此当 n 时:

k=1nakbk=k=1n1Sk(akak+1)+Snank=1n1Sk(akak+1)+Snan=k=1nakbσ(k)

同理可以设 Tibn,bn1,,b1 也就是倒序的前 i 个数的和。那么显然有 SiSiTi,因为 Ti 是序列最大的 i 个数之和。这里也设 T0=0 方便计算。

则有:

Si(aiai+1)Si(aiai+1)Ti(aiai+1)

加之:

k=1nakbn+1k=k=1nak(TkTk1)=k=1n1Tk(akak+1)+Tnan(Tn=Sn)

因此:

k=1nakbkk=1nakbσ(k)k=1nakbn+1k

证毕。

思路:贪心之邻项交换

除了排序不等式,更直观的就是一种贪心思想:邻项交换

假设现在有 d1d2,p1<p2,由于:

d1p1+d2p2(d1p2+d2p1)=(d1d2)(p1p2)0

也就是说如果把较小的 p1 赋值给更大度数的点,不会得到更优的结果,这里也有一点抽屉原理的意思。既然不会得到更优的结果,那么按照 di 的大小顺序赋值即可。

代码

python
class Solution:
    def maximumImportance(self, n: int, roads: List[List[int]]) -> int:
        deg = [0] * n
        
        for x, y in roads:
            deg[x] += 1
            deg[y] += 1
        
        deg.sort()

        return sum(d * i for i, d in enumerate(deg, 1))

Released under the MIT License.