1 条题解

  • 0
    @ 2025-10-31 11:01:47

    题目重述

    NN 个机场,MM 条已定航班,每条航班 iiDiD_i 时刻从 XiX_i 起飞,直飞 YiY_i(飞行时间 TXi,YiT_{X_i,Y_i})。
    飞机降落在 kk 号机场后,需要 PkP_k 的维护时间才能再次起飞。
    我们可以在 00 时刻在任意机场放任意多架维护好的飞机,并且可以增开任意多条临时航线(即飞机可以从任意机场飞到任意机场,只要时间允许)。
    问最少需要多少架飞机才能完成所有 MM 条航班。


    思路分析

    1. 问题本质

    这是一个航班衔接问题
    一架飞机在执行完一个航班(或临时航线)降落后,经过维护时间,再飞一个临时航线到另一个机场,能否赶上下一个航班的起飞时间?

    如果飞机在完成航班 ii 后,能通过一些临时飞行赶到航班 jj 的起飞机场并且不晚于 DjD_j,那么 iijj 可以由同一架飞机执行。

    我们要最小化飞机数量,等价于用最少的飞机路径覆盖所有 MM 个航班,每个航班必须被一架飞机执行一次。


    2. 转化为图论模型

    把每个航班看作一个节点,共 MM 个节点。
    对于两个航班 iijj,如果飞机在完成 ii 后能赶到 jj 的起飞,则建立一条有向边 iji \to j

    判断能否接上的条件

    • 航班 iiDiD_i 时刻从 XiX_i 起飞,到达 YiY_i 的时间是 Di+TXi,YiD_i + T_{X_i,Y_i}
    • 然后维护时间 PYiP_{Y_i},所以最早再次起飞时间是 Di+TXi,Yi+PYiD_i + T_{X_i,Y_i} + P_{Y_i}
    • 如果要从 YiY_i 飞到 XjX_jjj 航班的起飞机场),需要时间 TYi,XjT_{Y_i, X_j}
    • 所以到达 XjX_j 的时间是 Di+TXi,Yi+PYi+TYi,XjD_i + T_{X_i,Y_i} + P_{Y_i} + T_{Y_i, X_j}
    • 这个时间必须 Dj\le D_jjj 航班的起飞时间),才能接上。

    即: $ D_i + T_{X_i,Y_i} + P_{Y_i} + T_{Y_i, X_j} \le D_j $ 则 iji \to j 有边。


    3. 最小路径覆盖

    有向无环图(DAG)中,最小路径覆盖数 = 节点数 - 最大匹配数(二分图匹配)。
    这里我们的图不一定是 DAG,因为可能有时间循环
    但注意:如果 iji \to j 有边,则 DjDi+正数D_j \ge D_i + \text{正数}(因为 TTPP 非负,且 XiYiX_i \ne Y_iXjYjX_j \ne Y_j 以及机场不同,时间严格增加?不一定严格,因为 PP 可能为 0 且 TT 可能为 0 吗?Ta,a=0T_{a,a}=0,但 XjYjX_j \ne Y_j,所以 TYi,XjT_{Y_i,X_j} 可能为 0 吗?如果 Yi=XjY_i = X_j,那么 TYi,Xj=0T_{Y_i,X_j} = 0,所以可能 Dj=Di+TXi,Yi+PYiD_j = D_i + T_{X_i,Y_i} + P_{Y_i},即可能相等,所以不是严格 DAG,但依然可以用二分图匹配做最小路径覆盖,因为匹配模型不要求 DAG,只要是有向图即可。)

    方法
    将每个航班拆成两个点:左部 uu 和右部 uu'
    如果原图有 iji \to j 的边,则在二分图中连接左部的 ii 和右部的 jj
    求最大匹配 mm,则最小路径覆盖 = MmM - m


    4. 为什么是最小路径覆盖

    初始时,每个航班单独一架飞机(MM 条路径)。
    如果匹配一条边 iji \to j,意味着 iijj 由同一架飞机执行,路径数减少 1。
    所以最小路径覆盖就是最少飞机数。


    5. 实现细节

    • 先用 Floyd 预处理机场间最短飞行时间(因为可以走临时航线,所以任意两机场 aba\to b 的最短时间 = Ta,bT_{a,b} 直接取,还是需要中转。题目允许临时航线,所以应该用 Floyd 计算任意两机场的最短飞行时间 dist[a][b]dist[a][b])。
    • 那么判断 iijj 能否接上时,从 YiY_iXjX_j 的时间用 dist[Yi][Xj]dist[Y_i][X_j] 即可。
    • 条件变为: $ D_i + T_{X_i,Y_i} + P_{Y_i} + dist[Y_i][X_j] \le D_j $
    • 建二分图,跑最大匹配(匈牙利或 Dinic)。

    6. 算法步骤

    1. 读入 N,M,P,TN, M, P, T
    2. 用 Floyd 计算 dist[u][v]dist[u][v] 表示 uu 机场到 vv 机场的最短飞行时间(初始 dist[i][j]=Ti,jdist[i][j] = T_{i,j})。
    3. 读入 MM 个航班 (Xi,Yi,Di)(X_i, Y_i, D_i)
    4. 对每对航班 (i,j)(i, j),判断: $ D_i + T_{X_i,Y_i} + P_{Y_i} + dist[Y_i][X_j] \le D_j $ 成立则 iji \to j 有边。
    5. 构建二分图,左部右部各 MM 个点,有边则连。
    6. 求二分图最大匹配 matchCountmatchCount
    7. 答案 = MmatchCountM - matchCount

    7. 复杂度

    • Floyd: O(N3)O(N^3)N500N \le 500,可行。
    • 建边: O(M2)O(M^2)M500M \le 500,可行。
    • 匈牙利: O(M×E)O(M \times E),最坏 O(M3)O(M^3),可行。

    • 1

    信息

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