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

题解:

  最大流第一题。orz黄学长。

  问最小需要点数转化一下,就是最大能不放的位置。以S为原点,向每行连一条容量为n-l[i]-在该行上不能放置点数,以T为汇点,每列向T连一条m-c[i]-在该列上不能放置数的边。再把每行对应的点与可以连接的列对应点连一条容量为1的边,最大流显然就是要求的最大数。

  然后用总点数减去这些就行。

 #include<cstdio>
#include<cstring>
const int T=;
const int S=;
inline int min(int a,int b){return a<b?a:b;}
inline int read(){
char ch=getchar();
int f=,x=;
while(!(ch>=''&&ch<='')){if(ch=='-')f=-;ch=getchar();}
while(ch>=''&&ch<=''){x=x*+(ch-'');ch=getchar();}
return x*f;
}
int m,n,k;
const int N=;
int l[N],c[N];
bool vis[N][N],used[N];
int rel[N],rec[N];
int tot,ans;
struct edges {
int v,cap;edges *last;
}edge[N<<],*head[N<<],*cur[N<<];int cnt;
inline void insert(int u,int v,int w){
edge[cnt].v=v;edge[cnt].last=head[u];edge[cnt].cap=w;head[u]=edge+cnt;cnt++;
edge[cnt].v=u;edge[cnt].last=head[v];edge[cnt].cap=;head[v]=edge+cnt;cnt++;
}
int q[N<<];
int dis[N<<];
int h,t;
bool bfs(){
memset(dis,,sizeof(dis));
dis[S]=,q[]=S;h=t=;
int u,v;
while(h<=t){
u=q[h++];
for(edges *i=head[u];i;i=i->last)
if(i->cap&&!dis[i->v])
dis[i->v]=dis[u]+,q[++t]=i->v;
}
if(dis[T]) return ;
else return ;
} int dfs(int u,int w){
if(u==T||w==) return w;
int ret=;
for(edges *i=head[u];i;i=i->last)if(i->cap&&(dis[i->v]==dis[u]+)){
int f=dfs(i->v,min(i->cap,w));
i->cap-=f,edge[(i-edge)^].cap+=f;
w-=f,ret+=f;
if(!w) break;
}
if(!ret) dis[u]=-;
return ret;
} inline int dinic(){
int ret=;
while(bfs()) ret+=dfs(S,0x7fffffff);
return ret;
}
int main()
{
m=read(),n=read(),k=read();
for(int i=;i<=m;i++)
l[i]=n-read();
for(int i=;i<=n;i++)
c[i]=m-read();
for(int i=,x,y;i<=k;i++)
{
x=read(),y=read();
vis[x][y]=;
rel[x]++,rec[y]++;
if(rel[x]>l[x]){puts("JIONG!");return ;}
if(rel[y]>l[y]){puts("JIONG!");return ;}
}
tot=n*m-k;
for(int i=;i<=m;i++)
insert(,i,l[i]-rel[i]);
for(int i=;i<=n;i++)
insert(m+i,T,c[i]-rec[i]);
for(int i=;i<=m;i++)
for(int j=;j<=n;j++)
if(!vis[i][j])insert(i,j+m,);
ans=dinic();
printf("%d\n",tot-ans);
}

【bzoj1458】士兵占领的更多相关文章

  1. BZOJ1458 士兵占领 网络流 最大流 SAP

    原文链接http://www.cnblogs.com/zhouzhendong/p/8384699.html 题目传送门 - BZOJ1458 题意概括 有一个M * N的棋盘,有的格子是障碍.现在你 ...

  2. BZOJ1458:士兵占领(有上下界最小流)

    Description 有一个M * N的棋盘,有的格子是障碍.现在你要选择一些格子来放置一些士兵,一个格子里最多可以放置一个士兵,障碍格里不能放置士兵.我们称这些士兵占领了整个棋盘当满足第i行至少放 ...

  3. bzoj1458: 士兵占领(最大流)

    题目描述 有一个M * N的棋盘,有的格子是障碍.现在你要选择一些格子来放置一些士兵,一个格子里最多可以放置一个士兵,障碍格里不能放置士兵.我们称这些士兵占领了整个棋盘当满足第i行至少放置了Li个士兵 ...

  4. bzoj1458 士兵占领

    费用流,连下面几类边 1.s->s',流量为n*m,费用为0,表示最多可放置n*m个士兵 2.s'->行 (1)流量为a[i],费用为-n*m,表示必须在这一行放置a[i]个士兵. (2) ...

  5. BZOJ1458 士兵占领 【带上下界网络流】

    题目链接 BZOJ1458 题解 对行列分别建边,拆点,设置流量下限 然后\(S\)向行连边\(inf\),列向\(T\)连边\(inf\),行列之间如果没有障碍,就连边\(1\) 然后跑最小可行流即 ...

  6. bzoj1458: 士兵占领 网络流

    链接 https://www.lydsy.com/JudgeOnline/problem.php?id=1458 也可以去luogu 思路 想成倒着删去点,使得依旧满足覆盖!! 左边横,右边列,之间用 ...

  7. bzoj1458士兵占领

    传送门 和上一题差不多,每行和每列分别看做一个点,障碍点坐标的行和列就不建边,再按照有源汇上下界建图就好了,唯一的区别就是这个题求的是最小流 这个题的数据好水呢,建错图也能A呢 #include< ...

  8. 【BZOJ1458】士兵占领 最小流

    [BZOJ1458]士兵占领 Description 有一个M * N的棋盘,有的格子是障碍.现在你要选择一些格子来放置一些士兵,一个格子里最多可以放置一个士兵,障碍格里不能放置士兵.我们称这些士兵占 ...

  9. 【BZOJ1458】【洛谷4311】士兵占领(网络流)

    [BZOJ1458][洛谷4311]士兵占领(网络流) 题面 BZOJ权限题,洛谷真好 Description 有一个M * N的棋盘,有的格子是障碍.现在你要选择一些格子来放置一些士兵,一个格子里最 ...

  10. 【BZOJ-1458】士兵占领 最大流

    1458: 士兵占领 Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 782  Solved: 456[Submit][Status][Discuss] ...

随机推荐

  1. EF添加

    1.添加单个模型(CreatRule()是构造模型)(Shop_ActivityRuleProduct是类) var rule = CreatRule(model); var ruled = db.S ...

  2. 重温Android中的消息机制

    引入: 提到Android中的消息机制,大家应该都不陌生,我们在开发中不可避免的要和它打交道.从我们开发的角度来看,Handler是Android消息机制的上层接口.我们在平时的开发中只需要和Hand ...

  3. nmon用法

    一.简介 nmon是一个简单的性能监测工具,可以监测CPU.内存.网络等的使用情况.它是一个系统监视.调优.性能测试工具,它能一次性提供大量性能相关的信息. 二.安装与执行 下载地址:http://n ...

  4. PHPCMS V9里加入JS时生成首页出错

    有次在首页中加入JS,确认JS没有问题,但是在后台生成首页的时候一直出错. 查了半天才发现原来是JS里的“{}”问题,V9里调用内容也是用的大括号,冲突了. 解决方法是在“{”前面和后面分别加一个空格 ...

  5. Swift自增和自增运算

    自增和自增运算 和 C 语言一样,Swift 也提供了方便对变量本身加1或减1的自增(++)和自减(--)的运算符.其操作对象可以是整形和浮点型. ‌ var i = ++i // 现在 i = 1 ...

  6. 使用UDP完成网络通信

    语言聊天有可以接受丢包但是不能接受乱序的特性,所以可以采用UDP来 传输数据提高效率. 因为UDP本身不可靠传输的特性,为了保证玩家可靠的接入服务器和一些 操作的正确执行,还是需要一些额外的代码保证U ...

  7. [leetcode-504-Base 7]

    Given an integer, return its base 7 string representation. Example 1: Input: 100 Output: "202&q ...

  8. 【Android Developers Training】 87. 序言:同步到云

    注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...

  9. 【PHP】制作日历

    本期本博主将讲述两种利用PHP制作日历的方法,由于PHP日期函数的便捷性,使得我们制作日历这一过程变得相当简单 问题描述: 1.取到当前日期,并着色显示:2.根据当前日期,判断本月有多少天,一号是周几 ...

  10. GridView七十二绝技-大全(收藏版)(转至别人博客)

    快速预览:GridView无代码分页排序GridView选中,编辑,取消,删除GridView正反双向排序GridView和下拉菜单DropDownList结合GridView和CheckBox结合鼠 ...