poj-3662. Telephone Lines
考点
- 后效性处理
- 最短路
- 二分
- 双端队列BFS
题解
见思路
思路
分层图最短路
用动态规划的思想,设D[x, p]
表示从1
号节点到达基站x
,途中已经指定了p
条电缆免费时,经过的路径上最贵的电缆的花费最小是多少(选择一条从1
到x
的路径,使路径上第p + 1
大的边权尽量小)。
假设节点x
到节点y
有一长度为z
的无向边,有两种状态转移方式:
该边不免费。
那么应该用
max(D[x, p], z)
更新D[y, p]
的最小值该边免费。
用
D[x, p]
更新D[y, p + 1]
的最小值
通过作图可以发现,若以免费电缆数p
分层,整个动态规划的转移其实就是一张分层图:

每一层的图可能是有环的,也就是后效性;所以不能按照常规dp的方式做,要套SPFA,直至所有状态收敛。
1 |
|
二分 + 双端队列BFS
很难想的二分.........考虑直接枚举第k + 1
大的边权mid
。
因为必须是k + 1
大,应该存在一条路径,大于mid
的边权数量必须小于等于k
。
如何去在当前图里寻找一条满足条件的路径呢?
把所有升级价格大于mid
的电缆看作长度为1
的边,小于等于mid
的电缆看作长度为0
的边,然后求1
到n
的最短路是否小于等于k
即可,01边权
的最短路使用双端队列BFS进行求解。
如果最短路的开销小于等于k
,说明至少有一条路(最短路)满足条件,就可以继续向左边界收缩;
如果最短路的开销都大于k
,说明当前mid
太小了,比mid
大的数超过了k
个,需要向右边界扩张。
1 |
|