1 条题解

  • 0
    @ 2025-10-23 16:11:12

    题意

    我们有一个连通无向图,需要选择参数 XX,然后:

    1. 修建地下通道:所有与广场 11 距离 X\leq X 的广场之间互相连通

      • 花费:C×XC \times X
    2. 修补道路:对于每条道路,如果它的两个端点都距离广场 11 > XX,则需要修补

      • 花费:道路的长度 DiD_i

    目标:最小化总花费(地下通道花费 + 道路修补花费)


    关键观察

    1. 最优 XX 的候选值

    重要性质:最优的 XX 一定是某个广场到广场 11 的距离 dist[i]dist[i]

    证明:如果 XX 在区间 (dist[k],dist[k+1])(dist[k], dist[k+1]) 内:

    • XX 减小到 dist[k]dist[k]:地下通道花费减少,需要修补的道路可能减少或不变
    • 总花费不会增加,可能减少

    因此只需考虑 X=dist[i]X = dist[i]X=0X = 0

    2. 道路修补条件

    对于边 (u,v,d)(u, v, d),需要修补 当且仅当

    max(dist[u],dist[v])>X\max(dist[u], dist[v]) > X

    因为如果至少一个端点距离 X\leq X,那么该端点通过地下通道与广场 11 连通,另一端点也可以通过地下通道到达,不需要修补这条道路。


    算法思路

    步骤 1:计算最短路径

    从广场 11 出发,使用 Dijkstra 算法计算到所有广场的最短距离 dist[1..N]dist[1..N]

    步骤 2:预处理边信息

    对于每条边 i=(Ai,Bi,Di)i = (A_i, B_i, D_i),计算:

    maxDist[i]=max(dist[Ai],dist[Bi])maxDist[i] = \max(dist[A_i], dist[B_i])

    将边按 maxDistmaxDist 排序。

    步骤 3:计算前缀和

    计算排序后边长的前缀和数组 prefixSumprefixSum,用于快速计算 maxDist>XmaxDist > X 的所有边的总长度。

    步骤 4:枚举候选 XX

    考虑所有 dist[i]dist[i] 作为候选 XX,对于每个 XX

    1. 地下通道花费:C×XC \times X
    2. 道路修补花费:所有 maxDist>XmaxDist > X 的边的 DiD_i 之和
    3. 总花费:两者相加

    使用二分查找快速定位 maxDist>XmaxDist > X 的边。

    步骤 5:取最小值

    所有候选 XX 对应的总花费的最小值。


    复杂度分析

    • DijkstraO(MlogN)O(M \log N)
    • 排序边O(MlogM)O(M \log M)
    • 枚举候选值O(NlogM)O(N \log M)(二分查找)
    • 总复杂度O(MlogN)O(M \log N),适合题目数据范围

    样例验证

    样例 1

    输入:
    5 5 2
    2 3 1
    3 1 2
    2 4 3
    1 2 4
    2 5 5
    
    计算过程:
    1. 计算dist: dist[1]=0, dist[2]=2, dist[3]=2, dist[4]=5, dist[5]=7
    2. 边信息:
       (1,2,4): maxDist=2
       (1,3,2): maxDist=2  
       (2,3,1): maxDist=2
       (2,4,3): maxDist=5
       (2,5,5): maxDist=7
    3. 排序边:按maxDist=[2,2,2,5,7]
    4. 前缀和:[0,4,8,11,16,21]
    5. 枚举候选X:
       - X=0: 花费=0+21=21
       - X=2: 花费=4+(21-8)=17
       - X=5: 花费=10+(21-16)=15
       - X=7: 花费=14+0=14
    最小值为14
    

    总结

    这道题的关键在于:

    1. 识别最优解结构XX 一定是某个 dist[i]dist[i]
    2. 转化修补条件max(dist[u],dist[v])>X\max(dist[u], dist[v]) > X
    3. 使用前缀和优化:快速计算道路修补花费
    • 1

    信息

    ID
    3878
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    递交数
    1
    已通过
    1
    上传者