cf704D
给棋盘上n个棋子染色,红黑两种,代价不同,有m个约束,要求某一行或某一列的红黑棋子数差不能超过某一数值。求最小代价的染色方案。
上下界网络流的思路就是分别减去最低流量,剩余的放在图中跑最大流,对于原有大于零下界的边就通过新建超级源点ss和汇点tt解决,即出点多出的连向汇点,入点缺少的从源点补充。合法要求:源点s发出的必须能跑满,否则原有的平衡条件就打破了,无可行流。
对于原本就有源的情况如下图,先确立一个可行流,取t-s边的流量,再把t-s边去掉,跑最大流加上即可。
先明确建图方案。对某一行列的属性做文章的时候考虑裂点,我们用所有的xy坐标作点,原有的(x,y)点变成x->y边,表示由x选中它的同时会对y造成影响。这样形成了一个二分图,我们令某条边选便宜颜色的时候取流1,否则取0,这样原优化问题就变成了最大流问题,流量越大选取的便宜颜色越多。我们同时建立源点s汇点t,从s向每个x连边,容量表示每行能允许的某种颜色的数量(如果无限制则是该行上的点数,有限制则出现上下界),y同理连向t。这里我们发现出现了上下界网络流问题。套用上面算法解决即可。
在dinic的bfs中,如果把两个&&改成||会超时,按理说是完全等价的写法……这里卡了半天找原因。
1 |
|