题目暂无链接
( 北京2016区域赛C题 )
题目大意
给出一个N×N的01矩阵(N<=50,且N为偶数)。有N*N/2对可交换格子,每个格子有且仅有一个可交换对象。并且,每对可交换的格子必然在同一行或同一列。每交换一次的代价是1。对于每一行和每一列,都有一个1的个数的上界和下界。
问,最少执行多少次交换操作,可以满足所有行和列的1的个数的要求,
解答
比较明显的网络流构图,需要用到上下界,注意构图点数不要太多,否则会TLE,该压缩的必须要压缩。
把每一行每一列都看成一个状态,由于可交换的格子必然在同一行或同一列,所以每次交换必然只是从一个状态流向另一个状态。所以,我们可以先预处理出开始状态每一行每一列有多少个1( 记为g[i] ),从源点S向状态i (行或列)连一条上界下界均为g[i],费用为0的边。每个状态i都向汇点T连一条上下界为读入要求,费用为0的边。然后,统计出N*N/2对交换格子交换后由状态i 到状态 j的个数( 先用二维数组压缩统计,记为swg[i][ j ] ),状态i向状态j连一条下界为0,上界为swg[i][ j ],费用为1的边。
根据上述的构图,新添超级源点SS和超级汇点ST,根据模型,转化为下界均为0的网络流。最后,直接求解费用流即可。
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include