题目链接:点击打开链接
Time Limit: 8000/4000MS (
Java/Others)Memory Limit: 128000/64000KB (Java/Others) SubmitStatisticNext Problem
Problem Description
sweet和zero在玩矩阵游戏,sweet画了一个N * M的矩阵,矩阵的每个格子有一个整数。zero给出N个数Ki,和M个数Kj,zero要求sweet选出一些数,满足从第 i 行至少选出了Ki个数,第j列至少选出了Kj个数。 这些数之和就是sweet要付给zero的糖果数。sweet想知道他至少要给zero多少个糖果,您能帮他做出一个最优策略吗?
Input
首行一个数T(T <= 40),代表数据总数,接下来有T组数据。
每组数据:
第一行两个数N,M(1 <= N,M <= 50)
接下来N行,每行M个数(范围是0-10000的整数)
接下来一行有N个数Ki,表示第i行至少选Ki个元素(0 <= Ki <= M)
最后一行有M个数Kj,表示第j列至少选Kj个元素(0 <= Kj <= N)
Output
每组数据输出一行,sweet要付给zero的糖果数最少是多少
Sample Input
1
4 4
1 1 1 1
1 10 10 10
1 10 10 10
1 10 10 10
1 1 1 1
1 1 1 1
Sample Output
6
n行作为左端点 m作为右端点建一个二部图
n个点连到源点 流量为inf ,费用为0
m个点连到汇点 流量为inf 费用为0
n个点和m个点之间连一条费用为 mp[i][j] ,流量为1的点
--------------------------- 以上是普通建图-----------------------
为了达到有下界的效果
给下界对应的点加一个费用为-inf,流量为ki的边,这样让费用流强制把所有费用为-inf的边先跑
意思也就是先使得下界的边满流。
当费用>0时, 说明这次跑的边中不存在有下界的边,那么就相当于下界的边已经满流,所以直接终止费用流
#include
#include
#include
#include
#include
#include