1 条题解
-
0
题解
思路
图论刻画
无向连通图是 2-边连通图,当且仅当图中没有桥。
任意无桥连通图都可以从一个顶点开始,通过不断加入“耳”得到:
- 一条耳是一条简单路径;
- 路径的两个端点已经在当前图中,两个端点可以相同;
- 路径的所有内部点此前都没有出现。
端点相同时,加入的是一条只与旧图共享一个顶点的环。这个情形必须保留,否则无法表示多个环共用割点的图。
若一条耳有 个内部点,它恰好加入 条边。因此,问题转化为:把所有顶点分批作为耳的内部点加入,并最小化各耳的边数之和。
做法
子任务 1:枚举保留边集
当 时,最多只有 条边。按照保留边数从小到大枚举边集,对每个候选子图运行一次 Tarjan 桥检测。第一个连通且无桥的候选就是最优答案。
复杂度为 。
子任务 2:显式枚举简单耳
当 时,从每个起点执行 DFS,显式枚举所有不重复顶点的简单路径与简单环。对每个内部点集合 ,记录一条端点为 的耳。
令 表示已经覆盖顶点集合 时的最少边数,固定顶点 最先被覆盖。若存在一条内部点集合为 、两个端点都在 中的耳,则
显式枚举简单路径是阶乘级的,但在 时可行。它把边集搜索升级为耳分解状态,但还没有解决简单路径枚举的瓶颈。
满分算法:端点—内部点集路径 DP
定义布尔状态
表示存在一条从 到 的简单路径,其内部点集合恰好为 ,且 。允许 ,此时状态表示一条简单环。
对输入中的每条边 ,初始化 。若 ,并且 尚未出现在路径中且 是输入边,则可以转移到
需要排除在 时沿同一条边立刻返回起点的伪二元环。
得到全部耳状态后,仍使用上一节的集合 DP。实现中为每个内部集合 建立端点要求的向上闭包:只要已覆盖集合包含某一对合法端点,就可以在 时间判断该耳能否附着。所有互不相交的“已覆盖集合—新内部集合”组合总数为 。
时间复杂度为 ,空间复杂度为 。
方案恢复
集合 DP 为每个状态记录最后加入的内部点集合以及耳的两个端点。路径 DP 同时记录每个状态最后一步的前驱。逆序回溯集合 DP,再沿路径前驱逐条输出道路,即可得到最优保留边集。
正确性证明
首先,每次加入的耳只有端点属于旧图,内部点全新。耳上的每条新边都位于由该耳与旧图中端点间路径组成的环上;端点相同的闭耳本身就是一个环。因此,从第一条闭耳开始,逐次加耳后所得图始终连通且无桥。
其次,任意无桥连通图都存在允许闭耳的耳分解。取任意一个顶点作为初始覆盖集合,依次考察耳分解中的耳,它们恰好对应集合 DP 的一系列合法转移,且每条耳贡献“内部点数加一”条边。因此,集合 DP 不会遗漏任何可行最优子图。
综上,DP 得到的值既能构造出一个无桥连通子图,又不大于任意可行子图的边数,所以输出方案最优。
复杂度
- 子任务 1 的时间复杂度为 ,空间复杂度为 。
- 子任务 2 的显式路径枚举为阶乘级,集合合并部分为 ,空间复杂度为 。
- 满分算法的时间复杂度为 ,空间复杂度为 。
评测说明
本题允许多种最优方案。Testlib 评测器会验证:
- 输出道路均属于原图且互不重复;
- 保留图覆盖全部顶点、连通且没有桥;
- 输出道路数等于标准答案中的最优道路数;
- 输出结束后没有多余内容。
- 1
信息
- ID
- 1215
- 时间
- 2000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者