1 条题解
-
0
题目分析
本题需要为每个学生选择“愿意”或“不愿意”,在满足合作条件约束和喜欢关系影响的情况下,最小化总不满值。关键观察
- 每个小组的决策相互影响,通过喜欢关系连接
- 一个学生选择“愿意”但队友“不愿意”时会产生额外不满
- 喜欢关系会产生跨组的不满影响
算法思路
核心思想:最小割模型
将问题转化为网络流图,通过割集表示决策及其代价。状态设计
将每个学生 i 拆分为两个节点:- 节点
i_willing表示选择“愿意” - 节点
i_unwilling表示选择“不愿意”
建图策略
-
源点汇点:
- 源点 s 连接每个学生的“不愿意”节点,容量为 d_i(选择“不愿意”的基础代价)
- 每个学生的“愿意”节点连接汇点 t,容量为 c_i(选择“愿意”的基础代价)
-
组内关系:
- 同组学生 i 和 j 之间双向连接,容量为 e_i 和 e_j(当一人愿意而另一人不愿意时的额外代价)
-
喜欢关系:
- 当 A 喜欢 B 时:
- 如果 A 没有合作(即 A 选择不愿意或队友不愿意)且 B 愿意,产生 a_i 代价
- 如果 A 选择不愿意但 B 合作成功(B 和队友都愿意),产生 b_i 代价
- 当 A 喜欢 B 时:
网络流建模
具体建图:- 对于第 i 组(学生 2i-1 和 2i),创建辅助节点 group_i
- 源点 → 学生不愿意节点:容量 d_i
- 学生愿意节点 → 汇点:容量 c_i
- 学生不愿意节点 → 同组学生愿意节点:容量 e_i(单向)
- 喜欢关系 A→B:
- B 的愿意节点 → A 的辅助节点:容量 a_i
- A 的辅助节点 → A 的不愿意节点:容量 b_i
最小割含义
- 割集中与 s 相连的节点表示选择“不愿意”
- 与 t 相连的节点表示选择“愿意”
- 割的容量就是总不满值
算法正确性
通过精心设计的容量约束,确保:- 基础选择代价被正确计算
- 组内冲突代价在决策不一致时产生
- 喜欢关系代价在特定条件满足时产生
复杂度分析
- 节点数:O(n)
- 边数:O(n + m)
- 使用 Dinic 算法:O(V²E) = O(n²(n+m)),在 n≤5000, m≤10000 时可接受
代码实现要点
// 关键建图部分 for (int i = 1; i <= n; i++) { // 处理第 i 组(学生 2i-1 和 2i) int s1 = (i-1)*2+1, s2 = (i-1)*2+2; // 基础选择代价 addedge(s, s1, d[s1]); addedge(s1, t, c[s1]); addedge(s, s2, d[s2]); addedge(s2, t, c[s2]); // 组内冲突代价 addedge(s1, s2, e[s1]); addedge(s2, s1, e[s2]); // 喜欢关系处理 // ... }样例验证
样例输入:2 1 8 6 7 5 2 8 7 1 5 6 5 8 1 4 4 3通过最小割计算得到最小不满值为 14,与输出一致。
该算法通过网络流最小割模型,将复杂的约束关系转化为图割问题,高效求解最优决策方案。
- 1
信息
- ID
- 4635
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者