1 条题解

  • 0
    @ 2026-5-17 17:27:27

    L. Buggy DFS 详细题解

    问题重述

    给定一个整数 KK1K1091 \le K \le 10^9),要求构造一个无向简单图(节点数 N32768N \le 32768,边数 M65536M \le 65536),使得题目描述的 Buggy DFS(BDFS)算法的返回值恰好等于 KK。若不可能,输出 -1 -1


    关键观察

    记图 GG 的 BDFS 返回值为 k(G)k(G)(简称 kk 值)。

    引理 1(图合并):
    若有两个图 G1G_1G2G_2,其 kk 值分别为 k1k_1k2k_2,则可以通过将两图的起始节点(节点 11)合并为一个新节点,得到新图 GG,且 k(G)=k1+k2k(G) = k_1 + k_2
    证明:合并后,算法从公共起点开始,会依次完整遍历 G1G_1G2G_2 的所有边,计数相加。细节略。

    因此,若能构造出 kk 值为 aabb 的图,就能构造出 kk 值为 a+ba+b 的图。
    最小的非零 kk 值出现在两个节点相连的图:N=2,M=1N=2,M=1,算法过程:

    • 压入 11,弹出 11,遍历邻居 22counter=1counter=122 未访问,压入 22
    • 弹出 22,遍历邻居 11(已标记),counter=2counter=2,结束。 故 k=2k=2

    奇数 kk 值的可能性

    通过暴力枚举小图可知:

    • k=1,3,5,7,9k=1,3,5,7,9 均无法实现。
    • 最小能实现的奇数为 k=11k=11(例如样例 #3 中的图,k=23k=23 包含 1111 的因子)。

    结论

    • KK 为偶数,则可通过若干个 k=2k=2 的图合并得到。
    • KK 为奇数且 K11K \ge 11,则先合并一个 k=11k=11 的图,再将剩余偶数部分用 k=2k=2 补齐。
    • KK 为奇数且 K<11K < 11,则不可能,输出 -1 -1

    高效构造:一类特殊图

    为了减少节点数和边数,不直接使用大量 k=2k=2 的图(每个 k=2k=2 需要 2 节点 1 边),而是构造一种“大步长”图。

    考虑如下结构的图:共有 x+1x+1 个节点,编号 0,1,,x0,1,\dots,x(实际输出时从 11 开始),边集为:

    • 连接 00 与所有 ii1ix1 \le i \le x)的边,共 xx 条。
    • 连接 iii+1i+11i<x1 \le i < x)的边,共 x1x-1 条。 总边数 M=2x1M = 2x-1,节点数 N=x+1N = x+1

    可以计算该图的 kk 值为

    k(x)=x(x+3)2.k(x) = x(x+3) - 2.

    证明:通过模拟 BDFS 可导出递推关系,此处略。


    贪心构造算法

    给定目标 KK

    1. KK 为奇数且 K<11K<11,输出 -1 -1
    2. 初始化当前 kkcur=0cur = 0,当前图 GG 为空(一个单节点图,k=0k=0)。
    3. KK 为奇数,则先添加一个 k=11k=11 的图(其具体构造见代码或手工构造),令 cur=11cur = 11K=K11K' = K - 11;否则令 K=KK' = K(此时 KK' 为偶数)。
    4. K>0K' > 0 时:
      • 找到最大的 xx 使得 x(x+3)2Kx(x+3)-2 \le K'(若 KK' 较小,则 xx 可能为 11,此时 k=2k=2)。
      • 添加一个该类图(节点数 x+1x+1,边数 2x12x-1)到当前图(通过合并起点)。
      • 更新 K=K(x(x+3)2)K' = K' - (x(x+3)-2)
    5. 若最后 KK' 仍大于 00,则用若干个 k=2k=2 的图补齐(每个需要 2 节点 1 边)。
    6. 输出最终图的节点数和边数,以及所有边。

    由于每次选取的 xKx \approx \sqrt{K'},剩余值减少很快,总节点数 NN 可以控制在 3276832768 以内。


    复杂度分析

    每次取 xKx \approx \sqrt{K},剩余 KK 变为约 2K2\sqrt{K},因此迭代次数为 O(loglogK)O(\log \log K),每次二分查找 xxO(logK)O(\log K),总复杂度 O(K)O(\sqrt{K}) 主要在于遍历所有可能的 xx 值,但实际实现中可直接用解方程或二分。


    参考实现思路

    • 预处理或动态计算 k=11k=11 的图(例如样例 #3 中的图,其 k=23k=23,但我们需要 1111,可构造更小的图)。
    • 主循环使用二分查找最大 xx 满足 x(x+3)2Kx(x+3)-2 \le K'
    • 合并图时,注意重新编号节点,避免冲突。由于我们只关心最终图,可以直接在合并时累加节点数,并记录所有边(原图边 + 偏移后边)。
    • 最后输出。

    总结

    本题的核心在于发现 kk 值的可加性以及奇偶性限制,并利用一类特殊图以对数级步长逼近目标,使得构造满足节点数和边数的上限。对于无法构造的奇数 KK1,3,5,7,91,3,5,7,9),输出 -1 -1。其余情况均可构造。

    • 1

    信息

    ID
    7174
    时间
    1000ms
    内存
    256MiB
    难度
    6
    标签
    递交数
    0
    已通过
    0
    上传者