BZOJ 1458: 士兵占领

正文索引 [隐藏]

Description

有一个M * N的棋盘,有的格子是障碍。现在你要选择一些格子来放置一些士兵,一个格子里最多可以放置一个士兵,障碍格里不能放置士兵。我们称这些士兵占领了整个棋盘当满足第i行至少放置了Li个士兵, 第j列至少放置了Cj个士兵。现在你的任务是要求使用最少个数的士兵来占领整个棋盘。

Input

第一行两个数M, N, K分别表示棋盘的行数,列数以及障碍的个数。 第二行有M个数表示Li。 第三行有N个数表示Ci。 接下来有K行,每行两个数X, Y表示(X, Y)这个格子是障碍。

Output

输出一个数表示最少需要使用的士兵个数。如果无论放置多少个士兵都没有办法占领整个棋盘,输出”JIONG!” (不含引号)

Sample Input

4 4 4
1 1 1 1
0 1 0 3
1 4
2 2
3 3
4 3

Sample Output

4
数据范围
M, N <= 100, 0 <= K <= M * N

题解

这道题目感觉建图是有一点点脑洞的!
首先判断全放置了能不能满足要求!如果能的话,就进行网络流!
首先我们考虑每一行和每一列能删的最多的格子数,从源连到每一行,流量为每一行能删的格子数,再从每一列连到汇,流量为每一列能删掉的格子数量。这样一点一行一列都有可以删的格子,那么删掉好了!所以我们把没有禁止的格子的行和列再相连,流量为1,跑一边最大流,得出能删的最多的格子数。
用全部能放的格子数减去就是结果。

代码