这篇题解主要是对建模的详细说明(?
众所周知,最小割求的是最小值,所以我们肯定要转化为理论最大值-实际最小值,先考虑一个 naive 的模型:
这种情况下,我们理想状态下 ( i , j ) (i,j) (i,j) 的贡献应该是 a i , j + b i , j a_{i,j}+b_{i,j} ai,j+bi,j,很不幸, ( i , j ) (i,j) (i,j) 只能取一种状态,也就是实际上它的贡献是 a i , j + b i , j − min ( a i , j , b i , j ) a_{i,j}+b_{i,j}-\min(a_{i,j},b_{i,j}) ai,j+bi,j−min(ai,j,bi,j)。
这个时候明眼人已经能看出最小割了,回想一下最小割解决什么问题?集合划分的问题,建一个流网络, s s s 为源点, t t t 为汇点,每个节点 ( i , j ) (i,j) (i,j) 连向 s s s, t t t,容量分别为 a i , j , b i , j a_{i,j},b_{i,j} ai,j,bi,j ,一个 s − t s-t s−t 割的实际意义就是与 s s s 在同一子集的节点 ( i , j ) (i,j) (i,j) 取 a i , j a_{i,j} ai,j,与 t t t 在同一子集的节点 ( i , j ) (i,j) (i,j) 取 b i , j b_{i,j} bi,j。最小割割掉的边,实际上就是每个节点舍弃的状态(舍弃最小,答案就最大)。
回到这个问题,看到网格图考虑黑白染色,对于黑点就按上述方式建模,对于白点就翻转一下源点和汇点就好。
但是,现在我们还是什么都没做,因为这个模型 P 用没有。真正让这个模型有用的就是 c i , j c_{i,j} ci,j 的限制。
对于每一个黑点,由于我们的染色规则,必然它四个相邻的点是白点,考虑对于每个黑点计算贡献,显然这个东西可以拆开计算:
图很丑,见谅。
于是乎,一个黑点和四个白点理论最大贡献就是:
∑ c i , j + c i + d x , i + d y ( d x ∈ [ − 1 , 1 ] , d y ∈ [ − 1 , 1 ] ) \sum c_{i,j}+c_{i+dx,i+dy}(dx\in[-1,1],dy\in[-1,1] ) ∑ci,j+ci+dx,i+dy(dx∈[−1,1],dy∈[−1,1])
显然理论上限显然达不到,于是我们把刚刚的模型从垃圾桶捡回来(注意,这里是只有两个点的简单情况):
注意看中间是双向边。
问题解决了!
为什么呢?根据题目定义只有当两个相邻的点所取状态不同才会产生 c c c 的贡献,此时也就是这两个点归属于同一集合(因为不同颜色的汇点源点正好相反),不用删去 c i 1 , j 1 + c i 2 , j 2 c_{i1,j1}+c_{i2,j2} ci1,j1+ci2,j2 这条边,而如果两个点状态相同,它们会归属于不同集合,这样的情况下由于两者联通, s , t s,t s,t 必然联通,不符合流网络中割的定义,就一定会删除 c i 1 , j 1 + c i 2 , j 2 c_{i1,j1}+c_{i2,j2} ci1,j1+ci2,j2 这条边,也符合题意,所以跑个最大流求最小割就好了。