1 条题解
-
0
题意
我们有一个连通无向图,需要选择参数 ,然后:
-
修建地下通道:所有与广场 距离 的广场之间互相连通
- 花费:
-
修补道路:对于每条道路,如果它的两个端点都距离广场 > ,则需要修补
- 花费:道路的长度
目标:最小化总花费(地下通道花费 + 道路修补花费)
关键观察
1. 最优 的候选值
重要性质:最优的 一定是某个广场到广场 的距离 。
证明:如果 在区间 内:
- 将 减小到 :地下通道花费减少,需要修补的道路可能减少或不变
- 总花费不会增加,可能减少
因此只需考虑 和 。
2. 道路修补条件
对于边 ,需要修补 当且仅当:
因为如果至少一个端点距离 ,那么该端点通过地下通道与广场 连通,另一端点也可以通过地下通道到达,不需要修补这条道路。
算法思路
步骤 1:计算最短路径
从广场 出发,使用 Dijkstra 算法计算到所有广场的最短距离 。
步骤 2:预处理边信息
对于每条边 ,计算:
将边按 排序。
步骤 3:计算前缀和
计算排序后边长的前缀和数组 ,用于快速计算 的所有边的总长度。
步骤 4:枚举候选
考虑所有 作为候选 ,对于每个 :
- 地下通道花费:
- 道路修补花费:所有 的边的 之和
- 总花费:两者相加
使用二分查找快速定位 的边。
步骤 5:取最小值
所有候选 对应的总花费的最小值。
复杂度分析
- Dijkstra:
- 排序边:
- 枚举候选值:(二分查找)
- 总复杂度:,适合题目数据范围
样例验证
样例 1
输入: 5 5 2 2 3 1 3 1 2 2 4 3 1 2 4 2 5 5 计算过程: 1. 计算dist: dist[1]=0, dist[2]=2, dist[3]=2, dist[4]=5, dist[5]=7 2. 边信息: (1,2,4): maxDist=2 (1,3,2): maxDist=2 (2,3,1): maxDist=2 (2,4,3): maxDist=5 (2,5,5): maxDist=7 3. 排序边:按maxDist=[2,2,2,5,7] 4. 前缀和:[0,4,8,11,16,21] 5. 枚举候选X: - X=0: 花费=0+21=21 - X=2: 花费=4+(21-8)=17 - X=5: 花费=10+(21-16)=15 - X=7: 花费=14+0=14 最小值为14总结
这道题的关键在于:
- 识别最优解结构: 一定是某个
- 转化修补条件:
- 使用前缀和优化:快速计算道路修补花费
-
- 1
信息
- ID
- 3878
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者