题目: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=205,M=N*N<<1,INF=4e7+5;
int n,m,yhd[N<<1],hd[N<<1],xnt=1,cur[N<<1],bj,to[M],nxt[M],ycap[M],cap[M],dy[N<<1];
int sh[N],sl[N],s,t,ss,tt,tp[N<<1],ttp[N<<1];
int dfn[N<<1],q[N<<1],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=0;bool fx=1;char ch=getchar();while(ch>'9'||ch<'0'){if(ch=='-')fx=0;ch=getchar();}while(ch>='0'&&ch<='9')ret=ret*10+ch-'0',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]=0;
}
bool bfs(int mid)
{memset(dfn,0,sizeof dfn);dfn[ss]=1;q[he=tl=1]=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]+1,q[++tl]=v;}return dfn[tt];
}
int dinic(int cr,int flow)
{if(cr==tt)return flow;int use=0;for(int& i=cur[cr],v;i;i=nxt[i])if(dfn[v=to[i]]==dfn[cr]+1&&cap[i]){int tmp=dinic(v,Mn(flow-use,cap[i]));if(!tmp)dfn[v]=0;use+=tmp;cap[i]-=tmp;cap[i^1]+=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=2;i<=bj;i++)cap[i]=ycap[i];///
  for(int i=1;i<=n;i++){int l=Mx(sh[i]-mid,0),r=sh[i]+mid;cap[dy[i]]=r-l;cap[dy[i]^1]=0;ttp[i]+=l;ttp[s]-=l;}for(int i=1;i<=m;i++){int l=Mx(sl[i]-mid,0),r=sl[i]+mid;cap[dy[i+n]]=r-l;cap[dy[i+n]^1]=0;ttp[i+n]-=l;ttp[t]+=l;}int val=0;for(int i=0;i<=t;i++)if(ttp[i]>0)add(ss,i,ttp[i]),val+=ttp[i];else if(ttp[i]<0)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=1,d;i<=n;i++)for(int j=1;j<=m;j++)d=rdn(),sh[i]+=d,sl[j]+=d;int L=rdn(),R=rdn();s=0;t=n+m+1; ss=n+m+2;tt=n+m+3;for(int i=1;i<=n;i++)for(int j=1;j<=m;j++)add(i,j+n,R-L),tp[i]-=L,tp[j+n]+=L;add(t,s,INF);for(int i=1;i<=n;i++)add(s,i,0),dy[i]=xnt-1;for(int i=n+1,j=n+m;i<=j;i++)add(i,t,0),dy[i]=xnt-1;bj=xnt;memcpy(yhd,hd,sizeof hd);for(int i=2;i<=bj;i++)ycap[i]=cap[i];int l=0,r=2e5+5,ans;while(l<=r){int mid=l+r>>1;if(chk(mid))ans=mid,r=mid-1;else l=mid+1;}printf("%d\n",ans);return 0;
}

转载于:https://www.cnblogs.com/Narh/p/10122036.html

bzoj 2406 矩阵——有源汇上下界可行流相关推荐

  1. Shoot the Bullet(ZOJ3229)(有源汇上下界最大流)

    描述 ensokyo is a world which exists quietly beside ours, separated by a mystical border. It is a utop ...

  2. 【ACWing】2188. 无源汇上下界可行流

    题目地址: https://www.acwing.com/problem/content/2190/ 给定一个包含nnn个点mmm条边的有向图,每条边都有一个流量下界和流量上界.求一种可行方案使得在所 ...

  3. 3698: XWW的难题 有源汇上下界最大流

    有源汇上下界最大流,行列建图,下界为ai,ja_{i,j},上界为ai,j+1a_{i,j}+1,跑的飞起. 不要忘记判断上取整下取整相同的情况. #include<iostream> # ...

  4. BZOJ.3698.XWW的难题(有源汇上下界最大流ISAP)

    题目链接 按套路行列作为两部分,连边 \(S->row->column->T\). S向代表行的元素连边cap(A[i][n])(容量上下界为上下取整),代表列的元素向T连边cap( ...

  5. 【bzoj2406】矩阵 二分+有上下界可行流

    题目描述 输入 第一行两个数n.m,表示矩阵的大小. 接下来n行,每行m列,描述矩阵A. 最后一行两个数L,R. 输出 第一行,输出最小的答案: 样例输入 2 2 0 1 2 1 0 1 样例输出 1 ...

  6. BZOJ 3698: XWW的难题(有源汇上下界最大流)

    题面 XWW是个影响力很大的人,他有很多的追随者.这些追随者都想要加入XWW教成为XWW的教徒.但是这并不容易,需要通过XWW的考核. XWW给你出了这么一个难题:XWW给你一个N*N的正实数矩阵A, ...

  7. 有上下界网络流 ---- Zoj3229 Shoot the Bullet|东方文花帖|【模板】有源汇上下界最大流

    学习资料+题目链接 题目大意: 模板讲解 #include <bits/stdc++.h> #define mid ((l + r) >> 1) #define Lson rt ...

  8. [BZOJ3698]XWW的难题(有源汇上下界最大流+讲解)

    题目: 我是超链接 题解: 建图的话和有源汇可行流一样 求解方法: 在新图上跑ss到tt的最大流(附加源汇) 若新图满流,那么一定存在一种可行流 记此时∑f(s,i)=sum1∑f(s,i)=sum1 ...

  9. HDU 3157 Crazy Circuits(有源汇上下界最小流)

    HDU 3157 Crazy Circuits 题目链接 题意:一个电路板,上面有N个接线柱(标号1~N),还有两个电源接线柱 + -.给出一些线路,每一个线路有一个下限值求一个能够让全部部件正常工作 ...

最新文章

  1. python版mapreduce题目实现寻找共同好友
  2. Ultraedit 26.1安装教程
  3. java事件大全_Java sctipt常用事件汇总介绍
  4. display: inline-block;水平居中
  5. Plugin 框架 开发实录
  6. mysql+keepalived实现双主自由切换
  7. XenServer部署系列之05——虚拟机的创建及复制
  8. 介绍一篇路端传感器的cooperative perception(3D目标检测)论文
  9. 128道软件测试面试题,面试及答案,视频讲解
  10. 干货丨网站域名后缀都是什么含义?
  11. 手机拍证件照有什么诀窍
  12. 用Python分析周杰伦歌曲并进行数据可视化
  13. 计算机教师结构化方式面试,“中学信息技术学科”题目如何答?教师资格结构化面试...
  14. mongodb中文件导入报错error inserting documents解决方法
  15. 2016即将结束,你的目标实现了吗?
  16. 高中毕业礼物送什么比较好?第一名的礼物你绝对想不到
  17. C语言宏定义函数中的“_##”的意思
  18. QImage与Qpixmap的区别
  19. C语言 | 求a+aa+...+aa..a的值
  20. 北京英克赋能医药新零售:“全渠道”运营如何打破边界?

热门文章

  1. 从博客园博问站点迁移ASP.NET Core展望.NET Core
  2. 技术大牛养成指南,一篇不鸡汤的成功学实践
  3. Mac OS 系统重装U盘制作(DiskMaker X)
  4. 分享Silverlight/WPF/Windows Phone一周学习导读(07月25日-07月31日)
  5. FPGA开发综合技巧
  6. 低通采样和带通采样定理
  7. 如何修改远程登录端口号?
  8. 批量将中文单个字音频转为图像(二维矩阵)
  9. 爆肝800000秒想出低成本无人驾驶测距
  10. 对textfield的键盘改造成滚动选择器而不是输入键盘