bzoj1458士兵占领
传送门
和上一题差不多,每行和每列分别看做一个点,障碍点坐标的行和列就不建边,再按照有源汇上下界建图就好了,唯一的区别就是这个题求的是最小流
这个题的数据好水呢,建错图也能A呢
#include<cstdio>
#include<queue>
#include<cstring>
#include<iostream>
using namespace std;
#define rg register
#define min(a,b) (a<b?a:b)
int dis[2001],ans,n,m,k,cnt=1,s,t,ss,tt,sum,inf=1e9,pre[31000],nxt[31000],h[2001],v[30001],cur[2001],in[2001];
queue<int>q;bool mp[101][101];
void read(int &x) {
char ch; bool ok;
for(ok=0,ch=getchar(); !isdigit(ch); ch=getchar()) if(ch=='-') ok=1;
for(x=0; isdigit(ch); x=x*10+ch-'0',ch=getchar()); if(ok) x=-x;
}
void add(int x,int y,int z)
{
pre[++cnt]=y,nxt[cnt]=h[x],h[x]=cnt,v[cnt]=z;
pre[++cnt]=x,nxt[cnt]=h[y],h[y]=cnt;
}
bool bfs(int s,int t)
{
memset(dis,0,sizeof dis);
q.push(s),dis[s]=1;
while(!q.empty())
{
int x=q.front();q.pop();
for(int i=h[x];i;i=nxt[i])if(!dis[pre[i]]&&v[i])dis[pre[i]]=dis[x]+1,q.push(pre[i]);
}
return dis[t];
}
int dfs(int x,int flow,int t)
{
if(x==t||!flow)return flow;
int f=flow;
for(int &i=cur[x];i;i=nxt[i])
if(v[i]&&dis[pre[i]]>dis[x])
{
int y=dfs(pre[i],min(v[i],f),t);
f-=y,v[i]-=y,v[i^1]+=y;
if(!f)return flow;
}
if(f==flow)dis[x]=-1;
return flow-f;
}
int main()
{
read(n),read(m),read(k);s=0,t=n+m+1,ss=t+1,tt=ss+1;
for(rg int i=1,x;i<=n;i++)read(x),add(s,i,inf-x),in[i]+=x,in[s]-=x;
for(rg int i=1,x;i<=m;i++)read(x),add(i+n,t,inf-x),in[t]+=x,in[i+n]-=x;
for(rg int i=1,x,y;i<=k;i++)read(x),read(y),mp[x][y]=1;
for(rg int i=1;i<=n;i++)
for(rg int j=1;j<=m;j++)
if(!mp[i][j])add(i,j+n,1);
for(int i=0;i<=t;i++)
{
if(in[i]>0)add(ss,i,in[i]),sum+=in[i];
if(in[i]<0)add(i,tt,-in[i]);
}
add(t,s,inf);
for(;bfs(ss,tt);ans+=dfs(ss,inf,tt))memcpy(cur,h,sizeof cur);
if(ans!=sum){printf("JIONG\n");return 0;}
sum=0,ans=v[cnt];
for(int i=h[ss];i;i=nxt[i])v[i]=v[i^1]=0;
for(int i=h[tt];i;i=nxt[i])v[i]=v[i^1]=0;
v[cnt]=v[cnt^1]=0;
for(;bfs(t,s);sum+=dfs(t,inf,s))memcpy(cur,h,sizeof cur);
printf("%d\n",ans-sum);
}
bzoj1458士兵占领的更多相关文章
- BZOJ1458 士兵占领 网络流 最大流 SAP
原文链接http://www.cnblogs.com/zhouzhendong/p/8384699.html 题目传送门 - BZOJ1458 题意概括 有一个M * N的棋盘,有的格子是障碍.现在你 ...
- BZOJ1458:士兵占领(有上下界最小流)
Description 有一个M * N的棋盘,有的格子是障碍.现在你要选择一些格子来放置一些士兵,一个格子里最多可以放置一个士兵,障碍格里不能放置士兵.我们称这些士兵占领了整个棋盘当满足第i行至少放 ...
- bzoj1458: 士兵占领(最大流)
题目描述 有一个M * N的棋盘,有的格子是障碍.现在你要选择一些格子来放置一些士兵,一个格子里最多可以放置一个士兵,障碍格里不能放置士兵.我们称这些士兵占领了整个棋盘当满足第i行至少放置了Li个士兵 ...
- bzoj1458 士兵占领
费用流,连下面几类边 1.s->s',流量为n*m,费用为0,表示最多可放置n*m个士兵 2.s'->行 (1)流量为a[i],费用为-n*m,表示必须在这一行放置a[i]个士兵. (2) ...
- BZOJ1458 士兵占领 【带上下界网络流】
题目链接 BZOJ1458 题解 对行列分别建边,拆点,设置流量下限 然后\(S\)向行连边\(inf\),列向\(T\)连边\(inf\),行列之间如果没有障碍,就连边\(1\) 然后跑最小可行流即 ...
- bzoj1458: 士兵占领 网络流
链接 https://www.lydsy.com/JudgeOnline/problem.php?id=1458 也可以去luogu 思路 想成倒着删去点,使得依旧满足覆盖!! 左边横,右边列,之间用 ...
- 【BZOJ1458】士兵占领 最小流
[BZOJ1458]士兵占领 Description 有一个M * N的棋盘,有的格子是障碍.现在你要选择一些格子来放置一些士兵,一个格子里最多可以放置一个士兵,障碍格里不能放置士兵.我们称这些士兵占 ...
- 【BZOJ1458】【洛谷4311】士兵占领(网络流)
[BZOJ1458][洛谷4311]士兵占领(网络流) 题面 BZOJ权限题,洛谷真好 Description 有一个M * N的棋盘,有的格子是障碍.现在你要选择一些格子来放置一些士兵,一个格子里最 ...
- 【BZOJ-1458】士兵占领 最大流
1458: 士兵占领 Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 782 Solved: 456[Submit][Status][Discuss] ...
随机推荐
- tornado之运行第一个tornado程序
Tornado是使用Python编写的一个强大的.可扩展的Web服务器.它在处理严峻的网络流量时表现得足够强健,但却在创建和编写时有着足够的轻量级,并能够被用在大量的应用和工具中. 首先是安装torn ...
- PAT天梯赛 L2-027. 名人堂与代金券 【排序】
题目链接 https://www.patest.cn/contests/gplt/L2-027 思路 在输入的时候 判断分数 是否符合领取代金券条件 如果符合 SUM 就加上对应的代金券价值 然后在对 ...
- ubuntu12.04离线安装libjpeg62-dev
0:如果的电脑能连接上网络,用apt-get install安装最爽,我的情况是:公司电脑用的内网,访问不了外网,而且不让访问外网,安装软件只能用u盘拷进去再安装,所以我用如下方法 1:下载安装包,地 ...
- 简述arp协议的工作原理
在每台安装有TCP/IP协议的电脑里都有一个ARP缓存表,表里的IP地址与MAC地址是一一对应的,如: 我们以主机A(192.168.1.5)向主机B(192.168.1.1)发送数据为例.当发送数据 ...
- sendevent是使用
按下: sendevent /dev/input/event4 1 254 1 sendevent /dev/input/event4 0 0 0 松开: sendevent /dev/input/e ...
- 自动化测试框架selenium+java+TestNG——配置篇
最近来总结下自动化测试 selenium的一些常用框架测试搭配,由简入繁,最简单的就是selenium+java+TestNG了,因为我用的是java,就只是总结下java了. TestNG在线安装: ...
- servlet与jsp理论知识讲解
servlet是java服务器端编程,是运行在服务器上的.不同于以前的java小程序. ...
- 点分治 [IOI2011]Race
BZOJ2599. 放板子.利用agc009-D 代码简洁了很多 #include <bits/stdc++.h> #define N 200005 using namespace std ...
- 一个表格中选定的tr,显示在另一个表格中
一.先获得表格A每点中行的下标index(); 二.申明一个数组,把下表全部push到数组中: 三.在用for循环遍历数组,同时申明html代码片段: 四.用html+=表格A tr:eq(arr[i ...
- 如何使用Psyco为你的Python程序提速
psyco加速Python执行速度的方法:要求: 版本对照:File name Python versions Well-tested withpsyco-x.y-win32-py ...