BZOJ 2406 二分+有上下界的网络流判定
思路:
求出每行的和 sum_row
每列的和 sum_line
二分最后的答案mid
S->i 流量[sum_row[i]-mid,sum_row[i]+mid]
i->n+j 流量[L,R]
n+j->T 流量 [sum_line[i]-mid,sum_line[i]+mid]
套用有上下界的网络流 判一下就好了..
//By SiriusRen
#include <queue>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int N=,M=;
int n,m,a[N][N],sum_row[N],sum_line[N],L,R;
struct Dinic{
int first[N*],next[M],v[M],w[M],vis[N*],tot,T,SS,TT,jy,du[N*],all;
void Add(int x,int y,int z){w[tot]=z,v[tot]=y,next[tot]=first[x],first[x]=tot++;}
void add(int x,int y,int z){Add(x,y,z),Add(y,x,);}
bool tell(){
memset(vis,-,sizeof(vis)),vis[SS]=;
queue<int>q;q.push(SS);
while(!q.empty()){
int t=q.front();q.pop();
for(int i=first[t];~i;i=next[i])
if(vis[v[i]]==-&&w[i])
vis[v[i]]=vis[t]+,q.push(v[i]);
}return vis[TT]!=-;
}
int zeng(int x,int y){
if(x==TT)return y;
int r=;
for(int i=first[x];~i&&y>r;i=next[i])
if(vis[v[i]]==vis[x]+&&w[i]){
int t=zeng(v[i],min(y-r,w[i]));
w[i]-=t,w[i^]+=t,r+=t;
}
if(!r)vis[x]=-;
return r;
}
int flow(){
int ans=;
while(tell())while(jy=zeng(SS,0x3f3f3f3f))ans+=jy;
return ans;
}
bool check(int x){
memset(first,-,sizeof(first)),
all=tot=,T=n+m+,SS=n+m+,TT=n+m+,
memset(du,,sizeof(du));
add(T,,0x3f3f3f3f);
for(int i=;i<=n;i++)add(,i,*x),du[i]+=sum_row[i]-x,du[]-=sum_row[i]-x;
for(int i=;i<=m;i++)add(i+n,T,*x),du[T]+=sum_line[i]-x,du[i+n]-=sum_line[i]-x;
for(int i=;i<=n;i++)
for(int j=;j<=m;j++)
add(i,j+n,R-L),du[j+n]+=L,du[i]-=L;
for(int i=;i<=T;i++){
if(du[i]>)add(SS,i,du[i]),all+=du[i];
else add(i,TT,-du[i]);
}if(flow()>=all)return ;
return ;
}
}d;
int main(){
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++)
for(int j=;j<=m;j++){
scanf("%d",&a[i][j]);
sum_row[i]+=a[i][j];
sum_line[j]+=a[i][j];
}
scanf("%d%d",&L,&R);
int l=,r=,ans=;
while(l<=r){
int mid=(l+r)>>;
if(d.check(mid))r=mid-,ans=mid;
else l=mid+;
}printf("%d\n",ans);
}
BZOJ 2406 二分+有上下界的网络流判定的更多相关文章
- BZOJ 3876 有上下界的网络流
思路: 套用有上下界的网络流 就好了 (这算是裸题吧) 比如 有条 x->y 的边 流量上限为R 下限为L 那么du[x]-=L,du[y]+=L 流量上限变成R-L du[x]>0 ...
- 【BZOJ2406】矩阵 二分+有上下界的可行流
[BZOJ2406]矩阵 Description Input 第一行两个数n.m,表示矩阵的大小. 接下来n行,每行m列,描述矩阵A. 最后一行两个数L,R. Output 第一行,输出最小的答案: ...
- ACM/ICPC 之 有流量上下界的网络流-Dinic(可做模板)(POJ2396)
//有流量上下界的网络流 //Time:47Ms Memory:1788K #include<iostream> #include<cstring> #include<c ...
- SGU 194. Reactor Cooling(无源汇有上下界的网络流)
时间限制:0.5s 空间限制:6M 题意: 显然就是求一个无源汇有上下界的网络流的可行流的问题 Solution: 没什么好说的,直接判定可行流,输出就好了 code /* 无汇源有上下界的网络流 * ...
- 【ZOJ2314】Reactor Cooling(有上下界的网络流)
前言 话说有上下界的网络流好像全机房就我一个人会手动滑稽,当然这是不可能的 Solution 其实这道题目就是一道板子题,主要讲解一下怎么做无源无汇的上下界最大流: 算法步骤 1.将每条边转换成0~u ...
- ZOJ 2314 有上下界的网络流
problemCode=2314">点击打开链接 题意:给定m条边和n个节点.每条边最少的流量和最多的流量.保证每一个节点的出入流量和相等,问能够形成吗,能够则输出每条边的流量 思路: ...
- poj_2396 有上下界的网络流
题目大意 一个mxn的矩阵,给出矩阵中每一行的和sh[1,2...m]以及每一列的数字的和目sv[1,2...n],以及矩阵中的一些元素的范围限制,比如a[1][2] > 1, a[2][3] ...
- 【BZOJ2502】清理雪道 有上下界的网络流 最小流
[BZOJ2502]清理雪道 Description 滑雪场坐落在FJ省西北部的若干座山上. 从空中鸟瞰,滑雪场可以看作一个有向无环图,每条弧代表一个斜坡(即雪道),弧的方向代表斜坡下降 ...
- 【2018沈阳赛区网络预选赛J题】Fantastic Graph 【有上下界的网络流】
要补的题太多了导致最近没写博客(好吧是我懒) 题目链接https://nanti.jisuanke.com/t/31447 题意 给出一个二分图,问能否挑选出一些边,使得每个点的度数都在[L,R]这个 ...
随机推荐
- ffmpeg从内存读取文件
正常情况,ffmpeg直接从文件读取 AVFormatContext * _ctx = NULL; avformat_open_input(&_ctx, _filePath, 0, 0); 我 ...
- css3的基础知识
transfrom的应用: 1.旋转:transform: rotate(30deg): 2.阴影效果:box-shadow: 10px 10px 5px #888888: 3.鼠标移入放大:tran ...
- Servlet+JSP(三):第一个Web程序
Servlet+JSP(三):第一个Web程序在学习了服务器并成功安装后,我们知道当浏览器发送请求给服务器后,服务器会调用并执行对应的逻辑代码进行请求处理.逻辑代 码是由程序员自己编写然后放进服务器进 ...
- codevs2833 奇怪的梦境
2833 奇怪的梦境 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题解 题目描述 Description Aiden陷入了一个奇怪的梦境:他被困 ...
- sqlalchemy子查询
使用subquery() 要使用c来定位上一个子句的属性 s1 = session.query(m.a,m.b).filter().subquery() s2 = session.query(s1.c ...
- (蓝桥)2017C/C++A组第一题迷宫
#include<iostream> #include<memory.h> using namespace std; char mi[10][10] ; int visited ...
- Git 基础教程 之 远程推送
当你从远程仓库克隆时,实际上Git自动把本地的master分支和远程的master分支对应了起来,并且,远程仓库默认名称是origin. git remote 查看远程库信息 git remote - ...
- C库的制作
1.库的概念:库是一种可执行的二进制形式: 2.分类: 1>静态库 ①.在程序编译时会被连接到目标代码中: ②.程序运行时不再需要该静态库: ③.体积较大: 2>动态库/共享库 ①.在程序 ...
- Curious Cupid
There are K different languages in the world. Each person speaks one and only one language. There ar ...
- class类加载机制
1.类的加载过程 a.加载-链接-初始化-使用-卸载 加载: 查找并加载类的二进制数据 链接: 验证类的正确性,为类的静态变量分配内存,并将其初始化为默认值,把类的符号引用转换为直接引用. 初始化: ...