1 条题解
-
0
题目理解
我们有一个路由器网络,每条链路有距离(延迟),每个路由器有吞吐量限制(容量)。数据包必须沿着最短路径从 到 传输,要求计算最大吞吐量(即最大流,但只能在最短路径的边上流动)。
解题思路
这个问题可以拆成两个部分:
1.找出所有可能在最短路径上的边
用 Dijkstra 算法求出从路由器 到所有点的最短距离 。
一条边 在最短路径上当且仅当 。
2.在最短路径子图上求最大流
每个路由器有容量限制 ,表示经过它的数据包数量不能超过 (起点 和终点 无限制)。
为了处理点容量,常用拆点技巧:将路由器 拆成 和 (代码中用 和 ),中间连一条容量为 的边。
对于原图中的边 ,如果它在最短路径上,则在新图中连接 (容量无穷大)。
最后在拆点后的图上,从 到 (即 )跑最大流。
算法步骤
1.读入 和网络拓扑,用邻接矩阵存边(取最小重边)。
2.Dijkstra 求 到各点的最短距离。
3.建最大流图:
每个点 拆成 (入点)和 (出点)。
对于 和 ,入点到出点容量为 (起点终点无限制)。
对于 ,入点到出点容量为 。
对于原边 ,如果 ,则从 到 连 容量的边(双向都要判断)。
4.Dinic 算法 求 到 的最大流。
复杂度分析
,。
Dijkstra 用优先队列 。
Dinic 在拆点图上( 个点,边数 )复杂度 在本题可接受。
代码关键点
用邻接矩阵 e[u][v] 存最小边权。
拆点技巧: 为入点, 为出点。
最短路径 DAG 建边时,要双向判断 dis[i] + e[i][j] == dis[j]。
Dinic 使用当前弧优化。
总结
本题结合了最短路和网络流两个知识点,通过拆点处理点容量,并在最短路径 DAG 上求最大流,是一道比较经典的图论综合题。
- 1
信息
- ID
- 4904
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者