专栏文章

题解:CF1666K Kingdom Partition

CF1666K题解参与者 1已保存评论 0

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
0 条
当前快照
1 份
快照标识符
@mio2hx71
此快照首次捕获于
2025/12/02 12:17
3 个月前
此快照最后确认于
2025/12/02 12:17
3 个月前
查看原文
起因是 flama 大神讲课时有人提到了这个题。这个题有一个对最小割具有深刻启示作用的做法,我们后面再说,先来展示一下主播的做法。

神秘的做法

一个点有三个状态,这很不最小割,考虑如何刻画成两个集合。我一开始的想法是,把每个点拆成三个点 (u,0/1/2)(u,0/1/2),代表 [uA/B/C][u\in A/B/C] 这个布尔变量,但随即发现连边的限制长成这样:若 (u,0)S(u,0)\in S,且 (u,1)(u,1)(u,2)(u,2) 都属于 TT,则有代价 2w2w。与运算也太难处理了,我们无法控制两个点都没割 TT,于是倒闭了。
但是我们真的倒闭了吗?发现我们是会或运算的,所以想办法往上靠吧。注意到如果我们将原题的无向边,当成两条有向边来看待,即拆成两条「若 uA,vAu\in A,v\in A,则消耗 ww 代价」的边,那实际上两端点都为 A/BA/B 与一端点为 CC 消耗的代价就一样了!我们就不用把这两个东西分开看待了。再次修改状态,令 (u,0/1)(u,0/1) 分别代表 [uA][uC][u\in A]\vee [u\in C],以及 [uB][uC][u\in B]\vee [u\in C]。对于原图的边 (u,v,w)(u,v,w),我们分别连 ((u,0),(v,1),w),((u,1),(v,0),w),((v,0),(u,1),w),((v,1),(u,0),w)\Big((u,0),(v,1),w\Big),\Big((u,1),(v,0),w\Big),\Big((v,0),(u,1),w\Big),\Big((v,1),(u,0),w\Big) 四条边即可,代表若 uuA/CA/Cvv 不选 B/CB/C(即选 AA)有 ww 的代价;若 uuB/CB/Cvv 不选 A/CA/C(即选 BB)有 ww 的代价;将 u,vu,v 反过来同理。对于另一种限制 aA,bBa\in A,b\in B,直接连 (s,(a,0),inf),(s,(b,1),inf),((a,1),t,inf),((b,0),t,inf)\Big(s,(a,0),\text{inf}\Big),\Big(s,(b,1),\text{inf}\Big),\Big((a,1),t,\text{inf}\Big),\Big((b,0),t,\text{inf}\Big) 即可,代表如果这么选你会万劫不复。
看起来很美好,但是会发现还有一个 case,即当 (u,0),(u,1)(u,0),(u,1) 属于同一个集合时怎么处理。如果此时 uCu\in C 是合理的,但如果出现 [uA][uB][u\in A]\wedge [u\in B] 的情况就不对了,我们的建模中并没有判掉这种情况。但当我们将这种情况代入上面的连边时,发现实际上这种点与 CC 集合中的点的消耗是相同的,因此我们可以把这种矛盾的点当成 uCu\in C,并没有问题。构造方案的话,就从 ss 开始,在残量网络上搜,每次只经过没被割的边即可。这样搜到的状态的布尔值就是一。对于点 uu,若 (u,0/1)(u,0/1) 中只有一个被搜到过就输出对应的那个集合,否则输出 CC 即可。
下面展示更具有启发意义的做法。

不神秘的做法

最小割的另一种表达方式是,你有若干个布尔变量 x1,x2,,xnx_1,x_2,\dots,x_n,还有若干限制 (u,v,w)(u,v,w) 形如「若 xu=1,xv=0x_u=1,x_v=0,则消耗 ww 的代价」,要给这 nn 个变量赋值并最小化总代价 (u,v,w)Ewxu(1xv)\sum\limits_{(u,v,w)\in E}wx_u(1-x_v)。考虑将每个点只拆成两个状态 xA,xBx_A,x_B,代表 [xA][x\in A][xB][x\in B] 两个变量,这样 [xC][x\in C] 就可以表示成 1xAxB1-x_A-x_B。根据上式,重新写一下本题的式子:
(u,v,w)E2wxu,Axv,A+2wxu,Bxv,B+wxu,A/B(1xv,Axv,B)+wxv,A/B(1xu,Axu,B)\sum\limits_{(u,v,w)\in E}2wx_{u,A}x_{v,A}+2wx_{u,B}x_{v,B}+wx_{u,A/B}(1-x_{v,A}-x_{v,B})+wx_{v,A/B}(1-x_{u,A}-x_{u,B})
这非常不像最小割,考虑通过移项让其变成最小割的形式。有:
(u,v,w)Ewxu,A(1xv,B)+wxu,B(1xv,A)+wxv,A(1xu,B)+wxv,B(1xu,A)\sum\limits_{(u,v,w)\in E}wx_{u,A}(1-x_{v,B})+wx_{u,B}(1-x_{v,A})+wx_{v,A}(1-x_{u,B})+wx_{v,B}(1-x_{u,A})
这很最小割。直接根据式子反推回建模即可。但会发现还有一个 case,即当 xu,A=xv,A=1x_{u,A}=x_{v,A}=1 时如何处理。考虑这种点在式子中的贡献,将 A/B/CA/B/C 三类点以及这种点作为边的另一端点带进上式,发现贡献分别为 (w,w,0,0)(w,w,0,0),这与 CC 类点的贡献一模一样!因此我们不必再考虑这种点,并没有问题。
两种做法的建模是一样的,你可以看作第一种做法是在为第二种做法的 xu,A/Bx_{u,A/B} 找「组合意义」。在遇到类似的 0/10/1 赋值题目时,可以考虑第二种做法用式子套上最小割。
submission:https://codeforces.com/contest/1666/submission/336108915

评论

0 条评论,欢迎与作者交流。

正在加载评论...