bzoj 2406 矩阵——有源汇上下界可行流
题目: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 矩阵——有源汇上下界可行流的更多相关文章
- bzoj 2406 矩阵 —— 有源汇上下界可行流
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2406 这题,首先把题目那个式子的绝对值拆成两个限制,就成了网络流的上下界: 有上下界可行流原 ...
- POJ2396 Budget [有源汇上下界可行流]
POJ2396 Budget 题意:n*m的非负整数矩阵,给出每行每列的和,以及一些约束关系x,y,>=<,val,表示格子(x,y)的值与val的关系,0代表整行/列都有这个关系,求判断 ...
- 有源汇上下界可行流(POJ2396)
题意:给出一个n*m的矩阵的每行和及每列和,还有一些格子的限制,求一组合法方案. 源点向行,汇点向列,连一条上下界均为和的边. 对于某格的限制,从它所在行向所在列连其上下界的边. 求有源汇上下界可行流 ...
- 计蒜客 31447 - Fantastic Graph - [有源汇上下界可行流][2018ICPC沈阳网络预赛F题]
题目链接:https://nanti.jisuanke.com/t/31447 "Oh, There is a bipartite graph.""Make it Fan ...
- poj2396 Budget(有源汇上下界可行流)
[题目链接] http://poj.org/problem?id=2396 [题意] 知道一个矩阵的行列和,且知道一些格子的限制条件,问一个可行的方案. [思路] 设行为X点,列为Y点,构图:连边(s ...
- 算法复习——有源汇上下界可行流(bzoj2396)
题目: Description We are supposed to make a budget proposal for this multi-site competition. The budge ...
- poj2396有源汇上下界可行流
题意:给一些约束条件,要求算能否有可行流,ps:刚开始输入的是每一列和,那么就建一条上下界相同的边,这样满流的时候就一定能保证流量相同了,还有0是该列(行)对另一行每个点都要满足约束条件 解法:先按无 ...
- bzoj千题计划158:bzoj2406: 矩阵(有源汇上下界可行流)
http://www.lydsy.com/JudgeOnline/problem.php?id=2406 设矩阵C=A-B 最小化 C 一行或一列和的最大值 整体考虑一行或者一列的和 二分最大值 这样 ...
- ZOJ1994有源汇上下界可行流
http://fastvj.rainng.com/contest/236779#problem/G Description: n 行 m 列 给你行和 与 列和 然后有Q个限制,表示特定单元格元素大小 ...
随机推荐
- 转:25个Java机器学习工具和库
转自:http://www.cnblogs.com/data2value/p/5419864.html 本列表总结了25个Java机器学习工具&库: 1. Weka集成了数据挖掘工作的机器学习 ...
- UVA-11865 Stream My Contest (朱-刘 算法+二分)
题目大意:有一张n个顶点,m条边的有向图,根节点为0.每条边有两个权值,一个是费用c,一个是长度b.问在总费用不超过cost的情况下选出若干条边,使得n个点连通时的边的最短长度的最大值是多少. 题目分 ...
- IPv6 地址分类
IPv6本地链路地址 IPv6本地链路地址,类似于IPv4中APIPA(Automatic Private IP Addressing,自动专用IP寻址)所定义的地址169.254.0.0/16. I ...
- 为什么是link-visited-hover-active
前言 通常我们在设置链接的一些伪类(link,visited,hover,active)样式时,要让不同的状态显示正确的样式,我们需要按一定的顺序设置这些伪类的样式.这里我就按CSS2规范中推荐的顺序 ...
- centos7 iptables替换firewall
Disable Firewalld Service. [root@rhel-centos7-tejas-barot-linux ~]# systemctl mask firewalld Stop Fi ...
- 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 ...
- 抽奖小程序,js,canvas
js写的网页抽奖小程序,先上截图 源码地址:https://github.com/xiachaoxulu/raffle
- jQuery 选择器效率
http://blog.csdn.net/cxl444905143/article/details/48808809 ID > Tag > Class ID 选择器是速度最快的,这主要是因 ...
- 《Drools7.0.0.Final规则引擎教程》第4章 4.3 日历
日历 日历可以单独应用于规则中,也可以和timer结合使用在规则中使用.通过属性calendars来定义日历.如果是多个日历,则不同日历之间用逗号进行分割. 在Drools中,日历的概念只是将日历属性 ...
- Android响应式UI教程
原文:Responsive UI Tutorial for Android 作者:James Nocentini 译者:kmyhy 2017/5/4 更新说明: 由 James Nocentini 更 ...