建图:
- 默认当前所有网格都为白色(方便处理),因为如果考虑当前网格都是空的话,那么行列一共有白黑两种选择,就不好处理上下界的流量限制了)。
- 按1处理后,将行列分别视为点 i , j i,j i,j: 行列建边:
撤销白色的方块: 因为1中默认所有网格都为白色,所以需要有一条边进行撤销
a d d ( j , i , 1 , s w [ i ] [ j ] ) add(j , i, 1, sw[i][j]) add(j,i,1,sw[i][j])
涂黑色的方块: 因为可以将方块变成黑色,所以需要有一条边用于涂黑
a d d ( i , j , 1 , s b [ i ] [ j ] ) add(i,j,1,sb[i][j]) add(i,j,1,sb[i][j])
为什么这样一定正确?(注意到撤销白色方块是反向边,考虑到最小费用的特性首先会采取撤销白色方块的操作,所以满足题意) - 流量限制问题:
说实话当时现场赛的时候一直在纠结这个黑白动态性限制的存在怎么解决。
需要注意到题目中给定了条件:(流量限制一定存在一个可行解)
其实给定的 r , l r,l r,l说明了黑-白数量要满足这个区间,而我们建边的时候是撤销白色/增加黑色,实际上都是给黑-白这个整体(+1),所以看成一个整体就可以了。
然后根据上下界网络流的概念给行列点加限制即可。
但是这里要注意 l , r l,r l,r是有可能为负数的(笔者只学过两者都 ≥ 0 \geq0 ≥0的情况,看了一下清华的过题code感觉建边是有一些区别的,但是具体的原因不是很了解!?
隐隐约约有一种将负变正然后反过来建边,因为当都是正数的时候加了一条边 ( t , s , I N F ) (t,s,INF) (t,s,INF),而当都是负数的时候其实 s , t s,t s,