我们可以知道每行最多可以有多少个格子不用建点,设为x[i],每列同理设为y[i],那么我们连接(source,i,x[i]),(i,sink,y[i])表示我们将一个格子不建点,那么(i,j,flag[i][j]),当i,j这个格子可以建点的时候连边表示我们不在这个格子建点,那么n*m-k-最大流就是答案。  

  因为我们考虑可以在哪一个位置不放点,使得整个矩阵仍然合法,这样我们就可以知道最多有多少个合法的不建点的合法格子。  

  备注:开始想写有下限的最小可行流的着。

/**************************************************************
Problem: 1458
User: BLADEVIL
Language: C++
Result: Accepted
Time:28 ms
Memory:1788 kb
****************************************************************/ //By BLADEVIL
#include <cstdio>
#include <cstring>
#include <algorithm>
#define maxn 400
#define maxm 30010
#define inf (~0U>>1) using namespace std; int n,m,k,source,sink,ans,l;
int need[maxn][];
int flag[maxn][maxn];
int que[maxn],dis[maxn],last[maxn],pre[maxm],other[maxm],len[maxm]; void connect(int x,int y,int z) {
pre[++l]=last[x];
last[x]=l;
other[l]=y;
len[l]=z;
//if (z) printf("%d %d %d\n",x,y,z);
} int bfs() {
memset(dis,,sizeof dis);
que[]=source; dis[source]=;
int h(),t();
while (h<t) {
int cur(que[++h]);
for (int p=last[cur];p;p=pre[p]) {
if (dis[other[p]]) continue;
if (!len[p]) continue;
dis[other[p]]=dis[cur]+;
que[++t]=other[p];
if (other[p]==sink) return ;
}
}
return ;
} int dinic(int x,int flow) {
if (x==sink) return flow;
int rest=flow;
for (int p=last[x];p;p=pre[p]) {
if (!len[p]) continue;
if (dis[other[p]]!=dis[x]+) continue;
if ((!rest)||(!len[p])) continue;
int tmp=dinic(other[p],min(rest,len[p]));
if (!tmp) dis[other[p]]=;
len[p]-=tmp; len[p^]+=tmp; rest-=tmp;
}
return flow-rest;
} int main() {
scanf("%d%d%d",&n,&m,&k); l=;
for (int i=;i<=n;i++) scanf("%d",&need[i][]),need[i][]=m-need[i][];
for (int i=;i<=m;i++) scanf("%d",&need[i][]),need[i][]=n-need[i][];
for (int i=;i<=k;i++) {
int x,y; scanf("%d%d",&x,&y);
flag[x][y]=;
need[x][]--; need[y][]--;
}
for (int i=;i<=n;i++) if (need[i][]<) {
printf("JIONG!\n");
return ;
}
for (int i=;i<=m;i++) if (need[i][]<) {
printf("JIONG!\n");
return ;
}
source=n+m+; sink=source+;
for (int i=;i<=n;i++) connect(source,i,need[i][]),connect(i,source,);
for (int i=;i<=m;i++) connect(i+n,sink,need[i][]),connect(sink,i+n,);
for (int i=;i<=n;i++)
for (int j=;j<=m;j++) if (!flag[i][j])
connect(i,j+n,),connect(j+n,i,);
ans=n*m-k;
while (bfs()) ans-=dinic(source,inf);//,printf("%d\n",ans);
printf("%d\n",ans);
return ;
}

bzoj 1458 网络流的更多相关文章

  1. BZOJ 1458: 士兵占领( 网络流 )

    先判无解 把整个棋盘都放上士兵, 只需求最多可以拿走多少个士兵即可.每一行看做一个点r(i), 每一列看做一个点c(i) S->r(i), c(i)->T 连边, 容量为可以拿走的最大士兵 ...

  2. BZOJ 1458 士兵占领

    http://www.lydsy.com/JudgeOnline/problem.php?id=1458 题意:n x m的棋盘,k个位置不能放,每行和每列都有要求至少的士兵,求能否有最少的满足条件的 ...

  3. bzoj 1458: 士兵占领 -- 最大流

    1458: 士兵占领 Time Limit: 10 Sec  Memory Limit: 64 MB Description 有一个M * N的棋盘,有的格子是障碍.现在你要选择一些格子来放置一些士兵 ...

  4. BZOJ 2929 网络流

    题意是啥--. 思路: 不是与1或n连起来的边 边权是1 否则是inf 跑网络流 //By SiriusRen #include <queue> #include <cstdio&g ...

  5. BZOJ 1797 网络流的可行边&必须边

    求完网络流以后 tarjan一发 判一判 //By SiriusRen #include <queue> #include <bitset> #include <cstd ...

  6. BZOJ 1458 / Luogu P4311 士兵占领 (上下界最小流 / 直接最大流)

    做法1:上下界最小流 先来一发上下界最小流,思路比较暴力,就是把行和列看作n+mn+mn+m个点,(i,j)(i,j)(i,j)如果能占领就从第iii行向第jjj列连一条边,上界为1下界为0;然后从s ...

  7. BZOJ 3931 (网络流+最短路)

    题面 传送门 分析 考虑网络流 注意到数据包走的是最短路,所以我们只需要考虑在最短路上的边 由于最短路可能有多条,我们先跑一遍Dijkstra,然后再\(O(m)\) 遍历每条边(u,v,w) 如果d ...

  8. bzoj 1458 士兵占领(最大流)

    [题意] n行m列,第i行必须放L[i],第j列必须放C[j],有障碍格,求满足条件至少需要放多少. [思路] 至少放多少等价于最多不放多少. 对行列分别建XY点,则连边(S,Xi,a)(Yi,T,b ...

  9. 【刷题】BZOJ 1458 士兵占领

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

随机推荐

  1. 在spring环境下集成ActiveMQ

    1.参考文献 Spring集成ActiveMQ配置 Spring JMS异步发收消息 ActiveMQ 2.环境 在前面的一篇ActiveMQ入门实例中我们实现了消息的异步传送,这篇博文将如何在spr ...

  2. [知乎] 刚开始学习 iOS 开发有什么书推荐呢?

    http://www.zhihu.com/question/19649679 我来说说我学习的过程:(无耻的使用一个回答 回答了很多问题.^^) 第一步,精读 Stephen G. Kochan 的& ...

  3. C#带cookie Post和Get方式发送数据,保持cookie

    在实际编程中,可能需要读取特定网页的信息,但很多网站需要用户登录后,才能够获取相关的页面内容,这就需要编程者先临时存储当前的cookie,在C#中可以使用CookieContainer 对象来保存登录 ...

  4. python案例-用户登录

    要求: •输入用户名密码 •认证成功后显示欢迎信息 •输错三次后锁定 1 #!/usr/bin/env python 2 # -*- coding:utf-8 -*- 3 4 "" ...

  5. 2666 Accept Ratio(打表AC)

    2666 Accept Ratio  时间限制: 1 s  空间限制: 32000 KB  题目等级 : 钻石 Diamond 题解  查看运行结果     题目描述 Description 某陈痴迷 ...

  6. Linux Linux程序练习十一(网络编程大文件发送UDP版)

    //网络编程发送端--大文件传输(UDP) #include <stdio.h> #include <stdlib.h> #include <string.h> # ...

  7. C语言 常用的时间函数

    //时间函数的使用 #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<stdlib.h> #include& ...

  8. [iOS翻译]《iOS7 by Tutorials》系列:iOS7的设计精髓(下)

    我们继续上篇的内容 四.聚焦于内容 在iOS7里,强调的不是眼花缭乱的装饰效果,而是最重要的内容本身. 下面我们来探讨这个主题: 1.删除不必要的内容 伟大的设计更多是减法和加法的组合. 虽然很酷的想 ...

  9. 浪潮之巅——IT那点事之二—蓝色巨人IBM

    蓝色巨人IBM的全称是国际商用机器公司(International Business Machines Corporation),纵观IBM的发展历史,可以看出IBM与机器结缘,以商用为主的发展策略. ...

  10. 备份U盘分区表,未雨绸缪

    有时候,由于操作不当将U盘或者移动硬盘插入到电脑的时候会变成RAW格式,不可读取,这样的话就杯具了,只能用恢复软件试试看. 但是,如果一开始进行了备份的话,处理起来就简单多了. 用winhex打开U盘 ...