1 条题解

  • 0
    @ 2026-8-24 13:10:05

    题解

    思路推导

    一次操作能够从 uu 到达 vv,当且仅当原图中存在一条从 uuvv、长度恰为某个 2k2^k 的路径。可以先求出所有这种点对,再把它们看作新图中的一条边。问题就转化为新图中从 11nn 的最少边数。

    fk(u,v)f_k(u,v) 表示原图中是否存在长度恰为 2k2^k 的路径。原图中的每条边对应 f0f_0。一条长度为 2k2^k 的路径可以从中间切成两条长度为 2k12^{k-1} 的路径,因此可以通过枚举中点递推。

    题目只允许总长度不超过 23112^{31}-1,所以只需处理 k=0,1,,30k=0,1,\ldots,30

    做法

    先把原图边写入 f0f_0。对每个 k1k\ge1,枚举 u,x,vu,x,v;若 fk1(u,x)f_{k-1}(u,x)fk1(x,v)f_{k-1}(x,v) 都成立,则令 fk(u,v)f_k(u,v) 成立。

    只要某个 fk(u,v)f_k(u,v) 成立,就在新图中加入从 uuvv 的边,表示可以用一秒完成这段移动。最后在新图上从顶点 11 做 BFS,得到到顶点 nn 的最少边数。

    正确性证明

    kk 归纳。k=0k=0 时,f0(u,v)f_0(u,v) 恰好表示原图中存在一条边,即存在长度为 1=201=2^0 的路径。

    假设 fk1f_{k-1} 的含义正确。若递推得到 fk(u,v)f_k(u,v),则存在中点 xx,使得 uuxxxxvv 都有长度 2k12^{k-1} 的路径,连接后得到长度 2k2^k 的路径。反过来,任意长度 2k2^k 的路径在走完前 2k12^{k-1} 条边后到达某个中点 xx,两半都会被 fk1f_{k-1} 记录,故递推一定得到 fk(u,v)f_k(u,v)。归纳成立。

    因此新图中的每条边与一次合法的跑路器操作一一对应。新图中的一条从 11nn 的路径对应一系列合法操作,路径边数就是耗时;任何合法操作序列也对应新图中的同长路径。BFS 求得的最少边数即为最少秒数。

    复杂度分析

    共有 3131 层可达关系,每层枚举三个顶点。预处理时间复杂度为 O(31n3)O(31n^3),BFS 时间复杂度为 O(n2)O(n^2);空间复杂度为 O(31n2)O(31n^2)

    • 1

    信息

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