1 条题解
-
0
「重建」题解
题意简化
给定无向连通图 ,每条边有长度 。
关键点集合 (包含 和 )。
给所有边同时加上一个非负整数 后,要求:- 到 的全局最短路长度
- 等于 到 且只能经过关键点的最短路长度(关键点路径上所有点必须在 中)
求最大的 ,或判断:
- 不可能:输出
Impossible - 可以无限大:输出
Infinity
,。
核心观察
1. 关键点路径限制
只能经过关键点的路径:所有中间节点必须是 中的点。
这意味着路径可以表示为:,其中每个 。2. 加 的影响
每条边都加 ,那么:
- 任意长度为 的路径,新长度为
- 边数 = 路径经过的边数
关键思路:比较两类路径
设:
- : 到 的全局最短路长度(原图)
- : 到 的只走关键点的最短路长度(如果不可达则为 )
加 后,路径 的新长度 = 原长度 + ( 是边数)。
我们需要:
$$\min_{\text{全局路径 }P} \left[ d_1(P) + c \times |P| \right] = \min_{\text{关键点路径 }Q} \left[ d_2(Q) + c \times |Q| \right] $$解法:二分答案
1. 可行性判断
对于给定的 ,检查上述等式是否成立。
令:
- (全局最短路)
- (关键点最短路)
要求 。
2. 计算 和
由于每条边权重从 变为 ,可以:
- 在新图上跑最短路:边权为
- = 到 的新图最短路
- = 在只包含关键点 的诱导子图上跑最短路(边权同样加 )
但 需要在关键点子图上计算,而关键点之间可能通过非关键点连接?
不,关键点路径要求所有中间点都是关键点,所以只能在关键点之间直接有边时才能走。3. 预处理关键点间距离
提前计算:
- 对于每对关键点 ,计算全局最短距离 和对应边数
- 那么在加 后, 的新距离 =
关键点子图:完全图,边权为 对。
4. 二分
由于 最大可能很大,但答案有单调性:
- 如果 可行,那么更小的 也可能可行?
不一定,需要分析。
实际上, 和 都是关于 的线性分段函数(斜率是最短路径的边数)。
我们要求 的最大 。
算法步骤
-
预处理
- 在原图上跑全源最短路,得到每对点间的距离和边数
- 提取关键点集合 ,构建关键点完全图:
- 边 的权值 =
-
计算函数
- :在全局图上, 到 的最短路 =
- :在关键点图上, 到 的最短路 =
这两个都是分段线性凸函数(斜率递增)。
-
求解 我们需要最大的 使得 。
方法:
- 求出两个函数的所有分段点(斜率变化点)
- 比较两个函数,找到最后一个交点
- 如果没有交点 →
Impossible - 如果在某个点之后一直相等 →
Infinity
-
实现 由于 ,可以:
- 枚举所有可能的路径边数( 到 )
- 对于每个边数 ,计算 (全局最小距离)
- 同理计算 (关键点路径)
- 那么
然后比较这两个下凸包。
复杂度
- 全源最短路: 或
- 构建凸包:
- 求交点:
- 总复杂度可接受
关键点
- 将加 转化为路径的线性函数
- 和 是分段线性凸函数
- 比较两个凸包求最大交点
- 注意
Impossible和Infinity的情况
- 1
信息
- ID
- 6007
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者