1 条题解
-
0
问题理解
我们有一个初始的无向连通图:
- 个节点, 条边
- 所有原始边的权值都是
然后进行特殊操作:
- 对于所有最短距离恰好为 的点对
- 在它们之间添加一条权值为 的新边
最后问:从起点 到所有节点的最短距离是多少?
关键观察
-
新边的作用:新边实际上是在距离为 2 的节点对之间建立"捷径"
-
三种移动方式:
- 走 1 条原始边:花费
- 走 2 条原始边:花费
- 走 1 条新边:花费
-
重要结论:任何路径都可以看作是在原始图上走,偶尔用新边"跳过"2步
核心思路
方法:BFS + 距离分类
-
先用BFS计算原图中的最短距离(按边数计算,不是权值)
- :从 到 在原图中的最短步数
-
根据距离分类计算答案:
- 如果 是偶数:可以全部用新边,花费 =
- 如果 是奇数:最后一步必须用原始边,花费 =
- 但是!还要考虑完全用原始边的情况:花费 =
-
取最小值:
ans[i] = min(上述两种方案,dist[i] × a)
算法步骤
- 读入数据,建图
- 从 开始 BFS,计算每个点到 的最短步数
- 对于每个点 :
- 如果 是偶数:
candidate1 = (dist[i]/2) * b
- 如果 是奇数:
candidate1 = ((dist[i]-1)/2) * b + a
candidate2 = dist[i] * a
ans[i] = min(candidate1, candidate2)
- 如果 是偶数:
- 输出结果
样例验证
输入:
5 5 1 3 2 1 2 2 3 3 4 4 5 3 1
BFS距离:
[0,1,1,2,3]
计算:
- 点1:0
- 点2:min(1×3, 0×2+3) = 3
- 点3:min(1×3, 0×2+3) = 3
- 点4:min(2×3, 1×2+0) = min(6,2) = 2
- 点5:min(3×3, 1×2+3) = min(9,5) = 5
输出:
[0,3,3,2,5]
✓复杂度分析
- 时间复杂度:,一次BFS
- 空间复杂度:,存储图和距离数组
这种方法高效且易于实现,利用了新边的特殊性质来简化问题。
- 1
信息
- ID
- 3373
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者