题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2406

二分答案。把 b 的 n 个行作为一排, m 个列作为一排,每行和每列之间连上下界为 L , R 的边,源点向每行连以 “ a 的该行的值的和” 加/减 mid 为上下界的边,每列向汇点连以 “ a 的该列的值的和” 加/减 mid 为上下界的边;然后跑可行流就行了。

自己把和超级源点及超级汇点的无关的边先连好了,到时候改一改容量就行了。但别忘了把 hd[ ] , cap[ ] , xnt , tp[ ] 都赋回原来的值。

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=,M=N*N<<,INF=4e7+;
int n,m,yhd[N<<],hd[N<<],xnt=,cur[N<<],bj,to[M],nxt[M],ycap[M],cap[M],dy[N<<];
int sh[N],sl[N],s,t,ss,tt,tp[N<<],ttp[N<<];
int dfn[N<<],q[N<<],he,tl;
int Mn(int a,int b){return a<b?a:b;}
int Mx(int a,int b){return a>b?a:b;}
int rdn()
{
int ret=;bool fx=;char ch=getchar();
while(ch>''||ch<''){if(ch=='-')fx=;ch=getchar();}
while(ch>=''&&ch<='')ret=ret*+ch-'',ch=getchar();
return fx?ret:-ret;
}
void add(int x,int y,int z)
{
to[++xnt]=y;nxt[xnt]=hd[x];hd[x]=xnt;cap[xnt]=z;
to[++xnt]=x;nxt[xnt]=hd[y];hd[y]=xnt;cap[xnt]=;
}
bool bfs(int mid)
{
memset(dfn,,sizeof dfn);dfn[ss]=;
q[he=tl=]=ss;
while(he<=tl)
{
int k=q[he++];
for(int i=hd[k],v;i;i=nxt[i])
if(!dfn[v=to[i]]&&cap[i])
dfn[v]=dfn[k]+,q[++tl]=v;
}
return dfn[tt];
}
int dinic(int cr,int flow)
{
if(cr==tt)return flow;
int use=;
for(int& i=cur[cr],v;i;i=nxt[i])
if(dfn[v=to[i]]==dfn[cr]+&&cap[i])
{
int tmp=dinic(v,Mn(flow-use,cap[i]));
if(!tmp)dfn[v]=;
use+=tmp;cap[i]-=tmp;cap[i^]+=tmp;
if(use==flow)return use;
}
return use;
}
bool chk(int mid)
{
xnt=bj;memcpy(ttp,tp,sizeof tp);
memcpy(hd,yhd,sizeof yhd);//
for(int i=;i<=bj;i++)cap[i]=ycap[i];///
for(int i=;i<=n;i++)
{
int l=Mx(sh[i]-mid,),r=sh[i]+mid;
cap[dy[i]]=r-l;cap[dy[i]^]=;
ttp[i]+=l;ttp[s]-=l;
}
for(int i=;i<=m;i++)
{
int l=Mx(sl[i]-mid,),r=sl[i]+mid;
cap[dy[i+n]]=r-l;cap[dy[i+n]^]=;
ttp[i+n]-=l;ttp[t]+=l;
}
int val=;
for(int i=;i<=t;i++)
if(ttp[i]>)add(ss,i,ttp[i]),val+=ttp[i];
else if(ttp[i]<)add(i,tt,-ttp[i]);
while(bfs(mid))
memcpy(cur,hd,sizeof hd),val-=dinic(ss,INF);
return !val;
}
int main()
{
n=rdn();m=rdn();
for(int i=,d;i<=n;i++)
for(int j=;j<=m;j++)
d=rdn(),sh[i]+=d,sl[j]+=d;
int L=rdn(),R=rdn();
s=;t=n+m+; ss=n+m+;tt=n+m+;
for(int i=;i<=n;i++)
for(int j=;j<=m;j++)
add(i,j+n,R-L),tp[i]-=L,tp[j+n]+=L;
add(t,s,INF);
for(int i=;i<=n;i++)
add(s,i,),dy[i]=xnt-;
for(int i=n+,j=n+m;i<=j;i++)
add(i,t,),dy[i]=xnt-;
bj=xnt;
memcpy(yhd,hd,sizeof hd);
for(int i=;i<=bj;i++)ycap[i]=cap[i];
int l=,r=2e5+,ans;
while(l<=r)
{
int mid=l+r>>;
if(chk(mid))ans=mid,r=mid-;
else l=mid+;
}
printf("%d\n",ans);
return ;
}

bzoj 2406 矩阵——有源汇上下界可行流的更多相关文章

  1. bzoj 2406 矩阵 —— 有源汇上下界可行流

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2406 这题,首先把题目那个式子的绝对值拆成两个限制,就成了网络流的上下界: 有上下界可行流原 ...

  2. POJ2396 Budget [有源汇上下界可行流]

    POJ2396 Budget 题意:n*m的非负整数矩阵,给出每行每列的和,以及一些约束关系x,y,>=<,val,表示格子(x,y)的值与val的关系,0代表整行/列都有这个关系,求判断 ...

  3. 有源汇上下界可行流(POJ2396)

    题意:给出一个n*m的矩阵的每行和及每列和,还有一些格子的限制,求一组合法方案. 源点向行,汇点向列,连一条上下界均为和的边. 对于某格的限制,从它所在行向所在列连其上下界的边. 求有源汇上下界可行流 ...

  4. 计蒜客 31447 - Fantastic Graph - [有源汇上下界可行流][2018ICPC沈阳网络预赛F题]

    题目链接:https://nanti.jisuanke.com/t/31447 "Oh, There is a bipartite graph.""Make it Fan ...

  5. poj2396 Budget(有源汇上下界可行流)

    [题目链接] http://poj.org/problem?id=2396 [题意] 知道一个矩阵的行列和,且知道一些格子的限制条件,问一个可行的方案. [思路] 设行为X点,列为Y点,构图:连边(s ...

  6. 算法复习——有源汇上下界可行流(bzoj2396)

    题目: Description We are supposed to make a budget proposal for this multi-site competition. The budge ...

  7. poj2396有源汇上下界可行流

    题意:给一些约束条件,要求算能否有可行流,ps:刚开始输入的是每一列和,那么就建一条上下界相同的边,这样满流的时候就一定能保证流量相同了,还有0是该列(行)对另一行每个点都要满足约束条件 解法:先按无 ...

  8. bzoj千题计划158:bzoj2406: 矩阵(有源汇上下界可行流)

    http://www.lydsy.com/JudgeOnline/problem.php?id=2406 设矩阵C=A-B 最小化 C 一行或一列和的最大值 整体考虑一行或者一列的和 二分最大值 这样 ...

  9. ZOJ1994有源汇上下界可行流

    http://fastvj.rainng.com/contest/236779#problem/G Description: n 行 m 列 给你行和 与 列和 然后有Q个限制,表示特定单元格元素大小 ...

随机推荐

  1. 25.大白话说java并发工具类-CountDownLatch,CyclicBarrier,Semaphore,Exchanger

    1. 倒计时器CountDownLatch 在多线程协作完成业务功能时,有时候需要等待其他多个线程完成任务之后,主线程才能继续往下执行业务功能,在这种的业务场景下,通常可以使用Thread类的join ...

  2. spring boot @ConditionalOnxxx相关注解

    @Conditional(TestCondition.class) 这句代码可以标注在类上面,表示该类下面的所有@Bean都会启用配置,也可以标注在方法上面,只是对该方法启用配置. Spring框架还 ...

  3. Element-UI 实现下拉树

    组件调用 <template> <!-- 行模式 --> <el-form inline> <el-form-item label="inline ...

  4. Java开发微信公众号模板消息【同步|异步】

    第一步:申请模板消息功能并添加模板 在微信公众平台找到你需要的模板,并添加上即可: 第二步:添加功能模块后开始开发 功能中使用的类及代码: 发送数据主实体类: Template.java packag ...

  5. 【hive】解析json格式字符串

    (1)解析json中的单个属性  get_json_object(json_str,’$.xxx’/‘$[xxx]’) get_json_object函数第一个参数填写json对象变量(string) ...

  6. linux 字符串查找

    获取指定目录文件名包含指定字符的文件,然后遍历是否有包含特定字符串,有的话打出文件名 #!/bin/sh COMMAND=`find /data/home/ftp/data/20/201704/27/ ...

  7. 关于vue+element-ui的table多选禁用某个按钮

    在我做的项目中,有这样一个需求:当table多选没有勾选数据的时候禁用掉导出按钮 效果如图:      当选择一个时候可以导出这行的数据 在按钮定义  :disabled="selected ...

  8. LeetCode OJ:Gray Code(格林码)

    The gray code is a binary numeral system where two successive values differ in only one bit. Given a ...

  9. QT出现 Cannot create children for a parent that is in a different thread 的解决方法:

    timer = new Timer(this);改成 timer = new Timer();就可以了. 因为你timer是属于主线程的,尽量不要在非主线程里创建新的对象并指定其对象为主线程内的对象, ...

  10. c# DataTable 导出csv文件

    using System; using System.Data; using System.Configuration; using System.Collections.Generic; using ...