bzoj2673
限制这么多 肯定是网络流
考虑连边
首先我们计算出每行最多放的棋子数$sx[i]$,每列最多放的棋子数$sy[i]$
首先由源点向第$i$行连流量为$sx[i]$费用为$0$的边,第$i$列向汇点连流量为$sy[i]$费用为$0$的边,这个是套路
第一个限制很好解决,采用正难则反思想,考虑能“拆下”多少绿色信号灯,第$i$行向第$i$列连一条流量为他们最大可以拆下信号灯数量费用为$0$的边就可以了
我们考虑第二个限制
显然直接建边不是很可做
我们考虑枚举
如果枚举总流量的话,第一个限制中连的边的流量不好确定
我们考虑枚举每行每列最大的零件数量,记为$x$
这样每行向每列连流量为$x$的边就可以了
然后我们考虑绿色信号灯如何“拆除”
然后就会发现我们之前连的边...费用都是$0$
如果矩阵中某个点$(i,j)$是$.$的话
我们由第$i$行向第$j$列连流量为$1$,费用为$1$的边
然后跑最小费用最大流
这个费用流要注意,流量一定要等于所有可以安装的信号灯的数量
因为一个合法的流要么是经过“不拆除”的$i->i$费用为$0$的边
要么是经过拆除边
不可能出现“行上拆掉了列上没拆掉”的情况
最后用合法最大流流量 - 费用就是一组解
根据条件2判断是否可行即可
注意:请使用高效的费用流算法
Edmond-Karp算法可能会被某无良出题人造的毒瘤数据卡掉
建议使用zkw费用流,稠密图和二分图跑的飞快
这题建出来的图是一个二分图,所以你懂得