1 条题解
-
0
1. 问题重述
我们有:
- 个学生,编号 到
- 朋友关系是双向的,构成无向图
- 要把 划分成若干组 ,满足:
- 对每个组
- 对每个组 ,定义 跨组朋友对 数量:$$q_k = \big|\{ (u,v) \in E \mid u \in S_k, v \notin S_k \} \big| $$要求 。
问是否存在这样的划分,若存在则输出一个方案。
2. 关键观察
2.1 跨组边数的公式
设 表示顶点 在组 内的度数(与组内朋友的数量)。
那么 的跨组边数 。
整个组 的跨组边数:
注意每条跨组边在组 这一侧只算一次,所以这个公式正确。
因为 ,其中 是 内部的边集,所以:
2.2 合法组的条件
一个顶点子集 能作为一组,当且仅当:
因为 ,可能的合法组不会太多。
3. 算法思路
3.1 局部性原理
重要性质:任何合法组 的 外部邻居集合 $\partial S = \{ v \notin S \mid \exists u \in S, (u,v) \in E \}$ 的大小不超过 ,因为跨组边数 ,且不同组内顶点可能连接到同一个外部顶点,所以外部邻居数 。
于是:
这意味着:每个合法组及其直接邻居的总顶点数 。
3.2 枚举合法组
对每个顶点 ,考虑它的 -邻域:即 及其距离 的顶点中,大小不超过 的集合。
实际上,我们枚举所有大小 且包含 的集合 ( 是 的闭邻域),检查 是否是一个合法组:
- 计算
- 计算 $q_C = \sum_{u \in C} \deg(u) - 2 \cdot |E(C)| \le q$
收集所有合法组存入列表 。
3.3 动态规划
我们按顶点编号 进行覆盖型 DP。
设 表示覆盖顶点 所需的最少组数()。
转移:对于每个合法组 ,设它包含的最大编号顶点是 ,最小编号顶点是 ,则:
记录转移来源用于回溯。
初始 ,。
最终若 ,则存在划分,组数为 。
3.4 回溯构造方案
从 开始,根据 DP 转移记录,找到最后一组 ,然后跳到 继续回溯,得到所有组。
4. 复杂度分析
- 枚举合法组:对每个顶点 ,枚举 的大小 的子集,,在 时可接受。
- DP 阶段:, 量级。
5. 总结公式
- 合法组条件:$$|S| \le p, \quad \sum_{u \in S} \deg(u) - 2|E(S)| \le q $$
- 局部性原理:
- DP 转移:$$f[r] = \min_{S \ni r,\, S \text{合法}} \{ f[\min(S)-1] + 1 \} $$
这样我们就能在 的约束下高效求解。
- 1
信息
- ID
- 4284
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 8
- 已通过
- 1
- 上传者