1 条题解

  • 0
    @ 2026-9-3 11:14:35

    题解

    思路

    在已经乘坐 tt 次航班时,只有 di≤td_i\le t 的边可用。随 tt 增大,图只会在某些门槛 did_i 处加边。在两个相邻门槛之间,每一步使用同一张图转移,因此可用布尔邻接矩阵的快速幂跨过大段时间。

    做法

    子任务 1:航班序列搜索

    限制搜索深度为 max⁡di+n\max d_i+n,从城市 11 开始枚举每次可乘坐的航线。所有边激活后,若某个当前城市能到终点,去掉环后最短路不超过 n−1n-1,因此该深度上界充分。

    子任务 2:逐时刻可达集合 DP

    设 RtR_t 为恰好乘坐 tt 次航班后可能所在的城市集合。枚举全部航线,对每条满足 di≤td_i\le t 且 ai∈Rta_i\in R_t 的边,将 bib_i 放入 Rt+1R_{t+1}。扫描到 max⁡di+n\max d_i+n 即可。

    子任务 3:事件扫描与布尔矩阵快速幂

    按 did_i 排序航线。在时刻 tt 维护恰好走 tt 步的可达集合 RR与当前激活图 GG。若下一门槛为 TT:

    1. 先从 RR 作多源 BFS,若到城市 nn 的最短距离不超过 T−tT-t,立即得到最小答案;
    2. 否则用布尔矩阵 AGT−tA_G^{T-t} 将 RR 精确推进到时刻 TT;
    3. 加入所有 di=Td_i=T 的航线。

    全部航线加入后再做一次多源 BFS。若仍不可达则输出 Impossible。

    布尔矩阵的乘法使用位集合实现:若 Aik=1A_{ik}=1,就将 BB 的第 kk 行并入结果第 ii 行。

    复杂度

    第一层为指数级航班序列枚举;第二层时间复杂度为 O((max⁡di+n)m)O((\max d_i+n)m),空间 O(n)O(n);满分做法最多处理 mm 个门槛,复杂度为 O(mn3log⁡D/w)O(mn^3\log D/w) 位运算,空间 O(n2)O(n^2),其中 D=109D=10^9、ww 为机器字长。

    正确性证明

    在相邻门槛之间图不变,布尔邻接矩阵的 kk 次幂恰好表示长度为 kk 的有向游走可达性,所以快速幂得到的集合正好是门槛时刻的全部可能城市。每个区间内,任何最早到达都是从当前可达集合出发的最短路,因此 BFS 能精确检出是否在下一门槛前到达。若未到达,按时间顺序加入门槛边并继续,不会遗漏任何合法方案。

    • 1

    信息

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