【BZOJ2406】矩阵 二分+有上下界的可行流
【BZOJ2406】矩阵
Description
.jpg)
Input
第一行两个数n、m,表示矩阵的大小。
接下来n行,每行m列,描述矩阵A。
最后一行两个数L,R。
Output
第一行,输出最小的答案;
Sample Input
0 1
2 1
0 1
Sample Output
HINT
对于100%的数据满足N,M<=200,0<=L<=R<=1000,0<=Aij<=1000
题解:容易想到二分,并且这个和式可以拆成$\sum A_{ij}-\sum B_{ij}$的形式,然后就需要你看出来这是个有上下界的网络流问题了,设二分的答案为mid,建图方法如下:
1.S->第i行 下界$\sum\limits_{j=1}^m A_{ij}$-mid,上界$\sum\limits_{j=1}^m A_{ij}$+mid
2.第j列->T 下界$\sum\limits_{i=1}^n A_{ij}$-mid,上界$\sum\limits_{i=1}^n A_{ij}$+mid
3.第i行->第j列 下界L,上界R
然后跑可行流判定即可。
#include <cstdio>
#include <iostream>
#include <cstring>
#include <queue>
using namespace std;
queue<int> q;
int n,m,ans,tot,S,T,SS,TT,L,R,cnt;
int A[210][210],sx[210],sy[210],m1[410],m2[410],to[1000010],next[1000010],val[1000010],head[410],d[410];
inline int rd()
{
int ret=0,f=1; char gc=getchar();
while(gc<'0'||gc>'9') {if(gc=='-')f=-f; gc=getchar();}
while(gc>='0'&&gc<='9') ret=ret*10+gc-'0',gc=getchar();
return ret*f;
}
void add(int a,int b,int c)
{
to[cnt]=b,val[cnt]=c,next[cnt]=head[a],head[a]=cnt++;
to[cnt]=a,val[cnt]=0,next[cnt]=head[b],head[b]=cnt++;
}
int dfs(int x,int mf)
{
if(x==TT) return mf;
int i,temp=mf,k;
for(i=head[x];i!=-1;i=next[i])
{
if(d[to[i]]==d[x]+1&&val[i])
{
k=dfs(to[i],min(temp,val[i]));
if(!k) d[to[i]]=0;
val[i]-=k,val[i^1]+=k,temp-=k;
if(!temp) break;
}
}
return mf-temp;
}
int bfs()
{
while(!q.empty()) q.pop();
memset(d,0,sizeof(d));
q.push(SS),d[SS]=1;
int i,u;
while(!q.empty())
{
u=q.front(),q.pop();
for(i=head[u];i!=-1;i=next[i])
{
if(!d[to[i]]&&val[i])
{
d[to[i]]=d[u]+1;
if(to[i]==TT) return 1;
q.push(to[i]);
}
}
}
return 0;
}
bool check(int x)
{
int i,j,a,b;
memset(head,-1,sizeof(head)),tot=ans=cnt=0;
memset(m1,0,sizeof(m1)),memset(m2,0,sizeof(m2));
S=n+m+1,T=S+1,SS=T+1,TT=SS+1;
for(i=1;i<=n;i++)
{
a=max(sx[i]-x,0),b=sx[i]+x;
m1[S]+=a,m2[i]+=a,add(S,i,b-a);
}
for(i=1;i<=m;i++)
{
a=max(sy[i]-x,0),b=sy[i]+x;
m1[i+n]+=a,m2[T]+=a,add(i+n,T,b-a);
}
for(i=1;i<=n;i++) for(j=1;j<=m;j++) add(i,j+n,R-L),m1[i]+=L,m2[j+n]+=L;
for(i=1;i<=n+m+2;i++)
{
if(m1[i]>m2[i]) tot+=m1[i]-m2[i],add(i,TT,m1[i]-m2[i]);
if(m1[i]<m2[i]) add(SS,i,m2[i]-m1[i]);
}
add(T,S,1<<30);
while(bfs()) ans+=dfs(SS,1<<30);
return ans==tot;
}
int main()
{
n=rd(),m=rd();
int i,j,a;
for(i=1;i<=n;i++) for(j=1;j<=m;j++) a=rd(),sx[i]+=a,sy[j]+=a;
L=rd(),R=rd();
int l=0,r=40000000,mid;
while(l<r)
{
mid=(l+r)>>1;
if(check(mid)) r=mid;
else l=mid+1;
}
printf("%d",r);
return 0;
}//1 3 6 6 6 1 10
【BZOJ2406】矩阵 二分+有上下界的可行流的更多相关文章
- HDU Destroy Transportation system(有上下界的可行流)
前几天正看着网络流,也正研究着一个有上下界的网络流的问题,查看了很多博客,觉得下面这篇概括的还是相当精确的: http://blog.csdn.net/leolin_/article/details/ ...
- ZOJ 2314 带上下界的可行流
对于无源汇问题,方法有两种. 1 从边的角度来处理. 新建超级源汇, 对于每一条有下界的边,x->y, 建立有向边 超级源->y ,容量为x->y下界,建立有向边 x-> 超级 ...
- [ACdream 1211 Reactor Cooling]无源无汇有上下界的可行流
题意:无源无汇有上下界的可行流 模型 思路:首先将所有边的容量设为上界减去下界,然后对一个点i,设i的所有入边的下界和为to[i],所有出边的下界和为from[i],令它们的差为dif[i]=to[i ...
- 【bzoj2406】矩阵 二分+有上下界可行流
题目描述 输入 第一行两个数n.m,表示矩阵的大小. 接下来n行,每行m列,描述矩阵A. 最后一行两个数L,R. 输出 第一行,输出最小的答案: 样例输入 2 2 0 1 2 1 0 1 样例输出 1 ...
- BZOJ2406矩阵——有上下界的可行流+二分答案
题目描述 输入 第一行两个数n.m,表示矩阵的大小. 接下来n行,每行m列,描述矩阵A. 最后一行两个数L,R. 输出 第一行,输出最小的答案: 样例输入 2 2 0 1 2 1 0 1 样例输出 1 ...
- SGU 194 Reactor Cooling Dinic求解 无源无汇有上下界的可行流
题目链接 题意:有向图中有n(1 <= n <= 200)个点,无自环或者环的节点个数至少为3.给定每条边的最小流量和最大流量,问每条边的可行流量为多少? 思路:一般求解的网络流并不考虑下 ...
- bzoj 2406 二分+有源有汇上下界网络流可行流判定
弱爆了,典型的行列建模方式,居然想不到,题做少了,总结少了...... 二分答案mid s----------------------->i行-----------------------> ...
- sgu 194 上下界网络流可行流判定+输出可行流
#include <cstdio> #include <cstring> #define min(a,b) ((a)<(b)?(a):(b)) #define oo 0x ...
- zoj3229 Shoot the Bullet(有源汇有上下界的最大流)
题意: 一个屌丝给m个女神拍照,计划拍照n天,每一天屌丝给给定的C个女神拍照,每天拍照数不能超过D张,而且给每个女神i拍照有数量限制[Li,Ri],对于每个女神n天的拍照总和不能少于Gi,如果有解求屌 ...
随机推荐
- 广州地区常用的DNS解析服务器
广州电信DNS: 首选:202.96.128.143 备用:202.96.128.68 首选:202.96.134.133 备用:202.96.128.166 首选:61.144.56.100备用:6 ...
- Block为什么使用Copy?
block:本质就是一个object-c对象block:存储位置,可能分为3个地方:代码去,堆区.栈区(ARC情况下会自动拷贝到堆区,因此ARC下只能有两个地方:代码去.堆区)代码区:不访问栈区的变量 ...
- Cryptography I 学习笔记 --- 零碎
1. KDF(密钥推导函数,key derivation function),根据用户输入的一个初始密钥来生成一系列的后续密钥.可以使用PRF来生成 2. 可以用salt与slow hash func ...
- HDU 2034 人见人爱A-B【STL/set】
人见人爱A-B Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Sub ...
- 1219 骑士游历(棋盘DP)
1997年 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题解 题目描述 Description 设有一个n*m的棋盘(2≤n≤50,2≤m≤50),如 ...
- Topshelf+Quartz.net+Dapper+Npoi(一)
背景 前段时间公司有个需求(每天给业务导出一批数据,以excel的形式通过邮件发送给他).A说:直接写个服务,判断等于某个时间点,执行一下sql语句,生成excel,写个EmaiHelper发送给他不 ...
- TensorFlow笔记六:基于cifar10数据库的AlexNet识别
准确率只有70%,cpu版本的TF居然跑了两天才跑完,其他方法将继续尝试. 生成数据目录: import numpy as np import os train_label = {} for i in ...
- Django和Flask的区别以及运行流程
Django: Python Web框架里比较有名当属Django,Django功能全面,它提供一站式解决方案,集成了MVT(Model-View-Template)和ORM,以及后台管理.但是缺点也 ...
- node.js之http-server
我们有时候会遇到这种情况,一个html文件在本地打开时,测试平常的功能还行,但是,一涉及到ajax请求,就算你是请求本地的json文件,他都会涉及到跨域的问题,浏览器本身就限制了本地打开时,不允许跨域 ...
- js 模拟发短信
<!doctype html> <html> <head> <meta charset="utf-8"> <title> ...