题目: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机器学习工具和库

    转自:http://www.cnblogs.com/data2value/p/5419864.html 本列表总结了25个Java机器学习工具&库: 1. Weka集成了数据挖掘工作的机器学习 ...

  2. UVA-11865 Stream My Contest (朱-刘 算法+二分)

    题目大意:有一张n个顶点,m条边的有向图,根节点为0.每条边有两个权值,一个是费用c,一个是长度b.问在总费用不超过cost的情况下选出若干条边,使得n个点连通时的边的最短长度的最大值是多少. 题目分 ...

  3. IPv6 地址分类

    IPv6本地链路地址 IPv6本地链路地址,类似于IPv4中APIPA(Automatic Private IP Addressing,自动专用IP寻址)所定义的地址169.254.0.0/16. I ...

  4. 为什么是link-visited-hover-active

    前言 通常我们在设置链接的一些伪类(link,visited,hover,active)样式时,要让不同的状态显示正确的样式,我们需要按一定的顺序设置这些伪类的样式.这里我就按CSS2规范中推荐的顺序 ...

  5. centos7 iptables替换firewall

    Disable Firewalld Service. [root@rhel-centos7-tejas-barot-linux ~]# systemctl mask firewalld Stop Fi ...

  6. 3: 组件间的依赖管理 Managing Dependencies Between Components Using the Prism Library 5.0 for WPF(英汉对照版)

    Applications based on the Prism Library are composite applications that potentially consist of many ...

  7. 抽奖小程序,js,canvas

    js写的网页抽奖小程序,先上截图 源码地址:https://github.com/xiachaoxulu/raffle

  8. jQuery 选择器效率

    http://blog.csdn.net/cxl444905143/article/details/48808809 ID > Tag > Class ID 选择器是速度最快的,这主要是因 ...

  9. 《Drools7.0.0.Final规则引擎教程》第4章 4.3 日历

    日历 日历可以单独应用于规则中,也可以和timer结合使用在规则中使用.通过属性calendars来定义日历.如果是多个日历,则不同日历之间用逗号进行分割. 在Drools中,日历的概念只是将日历属性 ...

  10. Android响应式UI教程

    原文:Responsive UI Tutorial for Android 作者:James Nocentini 译者:kmyhy 2017/5/4 更新说明: 由 James Nocentini 更 ...