1 条题解
-
0
问题概述
给定一个有向图,包含 个节点和 条有向边。每条边有权值 表示车费,以及 表示翻转该边方向的代价。我们可以选择至多翻转一条边(改变其方向但不改变车费),目标是找到从节点 到节点 再返回节点 的最小总成本(车费 + 翻转代价)。
问题分析
关键观察
- 往返路径:需要计算 和 两条路径的最小车费和
- 边翻转:翻转一条边会影响两个方向的路径
- 图规模: 较小, 较大
算法思路
核心思想
由于 较小,我们可以预处理多个最短路径信息,然后枚举每条可能翻转的边,快速计算翻转后的总成本。
预处理阶段
需要计算以下最短路径:
-
原始图:
dist1[u]: 从 到各点的最短距离distN[u]: 从 到各点的最短距离
-
反向图(所有边反向):
rev_dist1[u]: 在反向图中从 到各点的最短距离(即原图中从各点到 的距离)rev_distN[u]: 在反向图中从 到各点的最短距离(即原图中从各点到 的距离)
枚举翻转边
对于每条边 :
-
不翻转该边:
- 总成本 =
dist1[N] + distN[1]
- 总成本 =
-
翻转该边(花费 代价):
- 考虑翻转后对两条路径的影响:
- 路径:可能使用翻转后的边
- 路径:可能使用翻转后的边
具体计算:
new_1_to_N = min(dist1[N], dist1[v] + c + rev_distN[u]) new_N_to_1 = min(distN[1], distN[v] + c + rev_dist1[u]) 总成本 = new_1_to_N + new_N_to_1 + d - 考虑翻转后对两条路径的影响:
特殊情况处理
- 如果原始图中 到 或 到 不连通,且翻转边后仍不连通,则输出
- 考虑不翻转任何边的情况
算法细节
最短路算法选择
由于 较小但 较大:
- 使用 Dijkstra 算法 配合堆优化
- 时间复杂度: 或
图表示
- 使用邻接表存储图结构
- 分别构建原始图和反向图
边界情况
- 重边处理:允许多条边连接相同节点
- 零权边: 可能为
- 大数值处理: 可达 ,注意整数溢出
复杂度分析
- 预处理:4 次 Dijkstra,
- 枚举边: 次查询,每次
- 总复杂度:,可以处理最大数据规模
实现要点
- 初始化:正确设置无穷大值,避免溢出
- 图构建:分别构建原始图和反向图
- 最短路径计算:确保正确处理不连通情况
- 答案更新:考虑所有可能情况,包括不翻转任何边
总结
本题是通过最短路预处理和枚举翻转边来解决的图论问题。关键在于预计算多个方向的最短路径信息,从而在枚举每条边时能够快速评估翻转的影响。算法充分利用了 较小的特点,通过合理的预处理将问题简化为 的枚举过程。
- 1
信息
- ID
- 4305
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者