1 条题解
-
0
L. Buggy DFS 详细题解
问题重述
给定一个整数 (),要求构造一个无向简单图(节点数 ,边数 ),使得题目描述的 Buggy DFS(BDFS)算法的返回值恰好等于 。若不可能,输出
-1 -1。
关键观察
记图 的 BDFS 返回值为 (简称 值)。
引理 1(图合并):
若有两个图 和 ,其 值分别为 和 ,则可以通过将两图的起始节点(节点 )合并为一个新节点,得到新图 ,且 。
证明:合并后,算法从公共起点开始,会依次完整遍历 和 的所有边,计数相加。细节略。因此,若能构造出 值为 和 的图,就能构造出 值为 的图。
最小的非零 值出现在两个节点相连的图:,算法过程:- 压入 ,弹出 ,遍历邻居 ,, 未访问,压入 。
- 弹出 ,遍历邻居 (已标记),,结束。 故 。
奇数 值的可能性
通过暴力枚举小图可知:
- 均无法实现。
- 最小能实现的奇数为 (例如样例 #3 中的图, 包含 的因子)。
结论:
- 若 为偶数,则可通过若干个 的图合并得到。
- 若 为奇数且 ,则先合并一个 的图,再将剩余偶数部分用 补齐。
- 若 为奇数且 ,则不可能,输出
-1 -1。
高效构造:一类特殊图
为了减少节点数和边数,不直接使用大量 的图(每个 需要 2 节点 1 边),而是构造一种“大步长”图。
考虑如下结构的图:共有 个节点,编号 (实际输出时从 开始),边集为:
- 连接 与所有 ()的边,共 条。
- 连接 与 ()的边,共 条。 总边数 ,节点数 。
可以计算该图的 值为
证明:通过模拟 BDFS 可导出递推关系,此处略。
贪心构造算法
给定目标 :
- 若 为奇数且 ,输出
-1 -1。 - 初始化当前 值 ,当前图 为空(一个单节点图,)。
- 若 为奇数,则先添加一个 的图(其具体构造见代码或手工构造),令 ,;否则令 (此时 为偶数)。
- 当 时:
- 找到最大的 使得 (若 较小,则 可能为 ,此时 )。
- 添加一个该类图(节点数 ,边数 )到当前图(通过合并起点)。
- 更新 。
- 若最后 仍大于 ,则用若干个 的图补齐(每个需要 2 节点 1 边)。
- 输出最终图的节点数和边数,以及所有边。
由于每次选取的 ,剩余值减少很快,总节点数 可以控制在 以内。
复杂度分析
每次取 ,剩余 变为约 ,因此迭代次数为 ,每次二分查找 需 ,总复杂度 主要在于遍历所有可能的 值,但实际实现中可直接用解方程或二分。
参考实现思路
- 预处理或动态计算 的图(例如样例 #3 中的图,其 ,但我们需要 ,可构造更小的图)。
- 主循环使用二分查找最大 满足 。
- 合并图时,注意重新编号节点,避免冲突。由于我们只关心最终图,可以直接在合并时累加节点数,并记录所有边(原图边 + 偏移后边)。
- 最后输出。
总结
本题的核心在于发现 值的可加性以及奇偶性限制,并利用一类特殊图以对数级步长逼近目标,使得构造满足节点数和边数的上限。对于无法构造的奇数 (),输出
-1 -1。其余情况均可构造。
- 1
信息
- ID
- 7174
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 6
- 标签
- 递交数
- 0
- 已通过
- 0
- 上传者