1 条题解

  • 0
    @ 2026-6-17 13:53:43

    题意:在三维空间里有 nn 个房间,每个房间有 c[i]c[i] 个门,两个房间如果都有门则可以建立通道连接,同时需要人为设置一个压强,低于这个压强且和 11 连通的房间的所有门都需要花费 0.30.3 一个封住,现在问能从 11 连通到 nn 的最小花费。

    阅读理解题,题面非常长,需要理解。

    理解题意后会发现很明显是一个图论问题,但是要思考如何求解最短路。

    首先可以思考枚举一个房间高度作为压强,然后从 11 出发暴力 spfa,可以发现对于当前房间 nownow 来说,需要枚举 1n1 \sim n 所有房间考虑能否连接通道,如果两边都有门,则可以花费欧几里得距离连接通道,但是这样是不够的。

    例如从 xx 连接到 yy,那么实际上会使得所有跟 yy 连接且高度低于压强的所有房间被注入解毒气体,那么也就是意味着,如果要将 xxyy 连接,实际花费除了连接通道的花费和封住 yy 剩余门的花费,还需要封住所有 yy 能连通并且低于压强的房间内的所有门。

    那么如果暴力枚举,这里还需要一个 bfsbfs 动态求出所有低于压强且与 yy 联通的房间的门数量,那么复杂度就会来到 O(n4)O(n^4),且代码较难实现,但是这种做法结合 impossibleimpossible 可以获得接近 5050 分的分数。

    接着思考如何优化,从上述过程中可以发现,核心问题还是出在当 xx 连接到 yy 时,要动态处理 yy 相关的房间,这是很麻烦的,但是这里可以发现,当压强不变的时候,yy 的连接花费是不变的。

    那么很容易可以想到,如果将所有房间按照高度排序,我们完全可以从最低的房间枚举到最高的房间作为压强,那么对于连接 yy 的花费来说,就一定是递增的。

    并且可以发现,当压强确定时,其实连接 yy 和连接 yy 相连的其他房间,效果是一致的,所以在枚举压强时,我们可以将 yy 的连接花费相关的房间看做是一个联通块,连到其中任何一个房间的效果和连到 yy 都是一样的,那么这里我们可以将它们用并查集直接合并成一个新的房间即可。

    有了以上思路以后,那么我们在枚举压强的过程中,实际上就是所有 高度<压强\text{高度}<\text{压强} 的房间形成了多个联通块,而新建道路也就是从 11 号房间所在的联通块到 nn 号房间所有的联通块的过程,而这个过程中需要保证中间经过的联通块至少有 22 个门,11nn 所在联通块至少有 11 个门。

    那么对于起点经过 xx 到达 yy 的连接花费就是 dis[x]+D[x][y]+c[y]0.30.6dis[x] + D[x][y] + c[y] * 0.3 - 0.6,其中 D[x][y]D[x][y] 表示从 xx 所在联通块建立通道到 yy 的最小花费(这个花费可以在合并联通块时同步处理),再加上 yy 所在联通块的门数量 20.3-2 * 0.3 的花费(需要两个门连接其他块,其他门全部需要花费资源封住)。

    那么只要如此做一次单源最短路即可,那么整体复杂度就会来到 O(n3)O(n^3)

    在枚举的过程中我们可以同步将被合并掉的点删除(当然不这么做也能过),并且 spfa 的复杂度并不稳定,所以实际运行效率会远小于 n3n^3。当然使用 dijkstra 也能过。

    代码实现可能有一定难度,需要思路非常清晰。

    • 1

    信息

    ID
    2673
    时间
    1000ms
    内存
    512MiB
    难度
    9
    标签
    (无)
    递交数
    1
    已通过
    1
    上传者