THUPC2022 初赛 I 分组作业 解题报告
班上 $2n$ 个学生分成了 $n$ 组,每组两个人。其中 $1$ 号和 $2$ 号为一组,$3$ 号和 $4$ 号为一组,……,$2n-1$ 号和 $2n$ 号为一组。
每个人决定是否愿意和队友合作,对于第 $i$ 个学生,选择“愿意”会产生 $c_i$ 的不满,选择“不愿意”会产生 $d_i$ 的不满。
如果两名队友都选择“愿意”,那么根据实际情况他们可以合作或者不合作。但是如果有一名队友选择“不愿意”,那么他们只能不合作。
如果一个学生 $i$ 选择了“愿意”但是他的队友选择了“不愿意”,那么他会因为队友产生 $e_i$ 的不满。
学生中还有 $m$ 个单向的喜欢关系,一个关系形如“$A$ 喜欢 $B$”。在这样一个关系中,有两种情况(其中 $i$ 表示第 $i$ 个关系,且保证 $A$ 和 $B$ 不在同一组):
- 如果 $A$ 没有和队友合作,且 $B$ 选择了“愿意”,$A$ 会有产生 $a_i$ 的不满
- 如果 $A$ 表决了“不愿意”,但 $B$ 成功与队友合作,那么 $A$ 会产生 $b_i$ 的不满。
问所有情况下最小的不满之和是多少。
$n \leq 5000,m \leq 10000$
解题思路:
我们先考虑分组的部分,首先确定这个题的模型要最小化不满,那就应该是最小割。
对每一组建图,每个人建一个点,每个组建一个点:
- 源点向每个人连一条容量为 $d_i$ 的边,表示不愿意
- 每个人向所在小组连一条容量为 $c_i$ 的边,表示愿意
- 每个小组再向每个人连一条容量为 $\text{INF}$ 的边,表示给选了愿意的一条回退的路(最小割建图经典方法)
- 两个人之间连边容量分别为 $e_x,e_y$ 表示一方愿意但是另一方不愿意
- 最后,每个小组向汇点连容量为 $c_i$ 的边,表示双方合作
如图(图源官方讲评 PPT):
这样的流一共有五种情况(图源官方讲评 PPT):
第一种情况是双方均不愿意,第二/三种情况是 $y/x$ 愿意但另一方不愿意。
这样我们就完成了没有喜欢关系的部分,喜欢关系的部分乍看之下需要拆点,实际上不用,对于一个喜欢关系我们可以这样建图:
- 从 $B$ 所在小组向 $A$ 连容量为 $b$ 边,表示 $A$ 不愿意但是 $B$ 合作了
- 从 $B$ 向 $A$ 所在小组连容量为 $a$ 边,表示 $A$ 没有成功合作但是 $B$ 愿意了。
这样我们就解决了本题。
代码:
1 | const int N = 5e6 + 10; |
THUPC2022 初赛 I 分组作业 解题报告