1 条题解
-
0
Guest
MOD
-
0
题意:在三维空间里有 个房间,每个房间有 个门,两个房间如果都有门则可以建立通道连接,同时需要人为设置一个压强,低于这个压强且和 连通的房间的所有门都需要花费 一个封住,现在问能从 连通到 的最小花费。
阅读理解题,题面非常长,需要理解。
理解题意后会发现很明显是一个图论问题,但是要思考如何求解最短路。
首先可以思考枚举一个房间高度作为压强,然后从 出发暴力 spfa,可以发现对于当前房间 来说,需要枚举 所有房间考虑能否连接通道,如果两边都有门,则可以花费欧几里得距离连接通道,但是这样是不够的。
例如从 连接到 ,那么实际上会使得所有跟 连接且高度低于压强的所有房间被注入解毒气体,那么也就是意味着,如果要将 和 连接,实际花费除了连接通道的花费和封住 剩余门的花费,还需要封住所有 能连通并且低于压强的房间内的所有门。
那么如果暴力枚举,这里还需要一个 动态求出所有低于压强且与 联通的房间的门数量,那么复杂度就会来到 ,且代码较难实现,但是这种做法结合 可以获得接近 分的分数。
接着思考如何优化,从上述过程中可以发现,核心问题还是出在当 连接到 时,要动态处理 相关的房间,这是很麻烦的,但是这里可以发现,当压强不变的时候, 的连接花费是不变的。
那么很容易可以想到,如果将所有房间按照高度排序,我们完全可以从最低的房间枚举到最高的房间作为压强,那么对于连接 的花费来说,就一定是递增的。
并且可以发现,当压强确定时,其实连接 和连接 相连的其他房间,效果是一致的,所以在枚举压强时,我们可以将 的连接花费相关的房间看做是一个联通块,连到其中任何一个房间的效果和连到 都是一样的,那么这里我们可以将它们用并查集直接合并成一个新的房间即可。
有了以上思路以后,那么我们在枚举压强的过程中,实际上就是所有 的房间形成了多个联通块,而新建道路也就是从 号房间所在的联通块到 号房间所有的联通块的过程,而这个过程中需要保证中间经过的联通块至少有 个门, 和 所在联通块至少有 个门。
那么对于起点经过 到达 的连接花费就是 ,其中 表示从 所在联通块建立通道到 的最小花费(这个花费可以在合并联通块时同步处理),再加上 所在联通块的门数量 的花费(需要两个门连接其他块,其他门全部需要花费资源封住)。
那么只要如此做一次单源最短路即可,那么整体复杂度就会来到 ,
在枚举的过程中我们可以同步将被合并掉的点删除(当然不这么做也能过),并且 spfa 的复杂度并不稳定,所以实际运行效率会远小于 。当然使用 dijkstra 也能过。
代码实现可能有一定难度,需要思路非常清晰。
- 1
信息
- ID
- 2673
- 时间
- 1000ms
- 内存
- 512MiB
- 难度
- 9
- 标签
- (无)
- 递交数
- 1
- 已通过
- 1
- 上传者