这篇题解主要是对建模的详细说明(?
众所周知,最小割求的是最小值,所以我们肯定要转化为理论最大值-实际最小值,先考虑一个 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? 这条边,也符合题意,所以跑个最大流求最小割就好了。
|