1 条题解

  • 0
    @ 2025-10-25 23:53:52

    题目大意

    给定一个 nn 个点 mm 条边的无向图,每条边有 kk 个权值 ai,ja_{i,j}。从点 11 出发,在 dd 天内到达点 nn(每天走一条边)。经过一条边时,可以选择将其某些类型的权值"收集"到最终答案中。要求求出 kk 个类型的最大字典序序列。


    核心思路

    1. 问题转化

    • 对于每种剑类型 jj,我们要在保证前 j1j-1 种剑价值最大的前提下,最大化第 jj 种剑的价值
    • 这相当于按优先级分层求解:先确定类型 11 的最大值,再固定这个值去求类型 22 的最大值,依此类推

    2. 关键观察

    对于第 uu 种剑,我们关心的是:

    • 是否存在一条从 11nn 的路径,长度 D\leq D
    • 路径上包含至少一条边,其 ae,ua_{e,u} 等于我们考虑的候选值 ansans
    • 并且这条路径不会降低前 u1u-1 种剑已经确定的最大值

    3. 状态压缩与 BFS

    • 用状态压缩记录前 u1u-1 种剑的收集情况
    • 定义 ds[x][S]ds[x][S]:从点 11 到点 xx,收集了状态 SS(表示前 u1u-1 种剑的哪些已经按最大值收集)的最短天数
    • 定义 dt[x][S]dt[x][S]:从点 nn 到点 xx,收集了状态 SS 的最短天数

    4. 判定公式

    对于候选值 ansans 和边 e=(x,y)e=(x,y),检查是否存在状态分割:

    ds[x][S]+dt[y][T]+1Dds[x][S] + dt[y][T] + 1 \leq D

    其中:

    • SSTT 是互补的状态分割
    • 要保证边 ee 上能收集到当前候选值 ansans
    • 并且不破坏前 u1u-1 种剑的已确定最大值

    5. 算法流程

    对每个剑类型 uu 依次处理:

    1. 用 BFS 预处理 dsdsdtdt
    2. 二分或扫描确定当前类型的最大值 ansans
    3. 标记所有能达到该最大值的边
    4. 输出结果,继续处理下一类型

    复杂度分析

    • 状态数:O(n2k)O(n \cdot 2^k)
    • 对每个类型进行两次 BFS:O(m2k)O(m \cdot 2^k)
    • 总复杂度:O(km2k)O(k \cdot m \cdot 2^k),在 k10k \leq 10 时可接受

    这种方法通过分层处理状态压缩,巧妙地解决了字典序优化问题。

    • 1

    信息

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