http://www.lydsy.com/JudgeOnline/problem.php?id=2406

设矩阵C=A-B

最小化 C 一行或一列和的最大值

整体考虑一行或者一列的和

二分最大值

这样每一行一列的和就有了范围

|Σai-Σbj|<=mid

去掉绝对值 Σai-mid <= Σbi <= Σai+mid

构图:

源点向行连下界为Σai-mid,上界为 Σai+mid 的边

列向汇点连下界为Σai-mid,上界为 Σai+mid 的边

第i行向第j列连下界为L,上界为R的边

上下界可行流验证

#include<queue>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm> #define N 405
#define M 41000 const int inf=2e9; int n,m,L,R; int sumh[N],suml[N]; int s,t,S,T; int d[N]; int SUM; int front[N],to[M<<],nxt[M<<],tot,val[M<<]; int lev[N],cur[N]; void read(int &x)
{
x=; char c=getchar();
while(!isdigit(c)) c=getchar();
while(isdigit(c)) { x=x*+c-''; c=getchar(); }
} void add(int u,int v,int w)
{
to[++tot]=v; nxt[tot]=front[u]; front[u]=tot; val[tot]=w;
to[++tot]=u; nxt[tot]=front[v]; front[v]=tot; val[tot]=;
//printf("%d %d %d\n",u,v,w);
} void build(int mid)
{
tot=;
memset(front,,sizeof(front));
memset(d,,sizeof(d));
SUM=;
for(int i=;i<=n;++i)
{
d[i]+=sumh[i]-mid;
d[s]-=sumh[i]-mid;
add(s,i,mid<<);
}
for(int i=;i<=m;++i)
{
d[t]+=suml[i]-mid;
d[n+i]-=suml[i]-mid;
add(n+i,t,mid<<);
}
for(int i=;i<=n;++i)
for(int j=;j<=m;++j)
{
d[n+j]+=L;
d[i]-=L;
add(i,n+j,R-L);
}
for(int i=;i<=t;++i)
{
if(d[i]>) add(S,i,d[i]),SUM+=d[i];
else if(d[i]<) add(i,T,-d[i]);
}
add(t,s,inf);
} bool bfs()
{
for(int i=S;i<=T;++i) lev[i]=-,cur[i]=front[i];
std::queue<int>q;
q.push(S);
lev[S]=;
int now;
while(!q.empty())
{
now=q.front();
q.pop();
for(int i=front[now];i;i=nxt[i])
if(lev[to[i]]==- && val[i])
{
lev[to[i]]=lev[now]+;
if(to[i]==T) return true;
q.push(to[i]);
}
}
return false;
} int dinic(int now,int flow)
{
if(now==T) return flow;
int rest=,delta;
for(int &i=cur[now];i;i=nxt[i])
if(lev[to[i]]==lev[now]+ && val[i])
{
delta=dinic(to[i],std::min(flow-rest,val[i]));
if(delta)
{
val[i]-=delta;
val[i^]+=delta;
rest+=delta;
if(rest==flow) break;
}
}
if(rest!=flow) lev[now]=-;
return rest;
} int maxflow()
{
int now=;
while(bfs()) now+=dinic(S,inf);
return now;
} bool check(int mid)
{
build(mid);
return SUM==maxflow();
} int main()
{
read(n); read(m);
S=; s=n+m+; t=n+m+; T=n+m+;
int x;
for(int i=;i<=n;++i)
for(int j=;j<=m;++j)
{
read(x);
sumh[i]+=x;
suml[j]+=x;
}
read(L); read(R);
int l=,r=2e6,mid,ans=-;
while(l<=r)
{
mid=l+r>>;
if(check(mid)) ans=mid,r=mid-;
else l=mid+;
}
std::cout<<ans;
}

bzoj千题计划158:bzoj2406: 矩阵(有源汇上下界可行流)的更多相关文章

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

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

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

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2406 二分答案.把 b 的 n 个行作为一排, m 个列作为一排,每行和每列之间连上下界为 ...

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

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

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

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

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

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

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

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

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

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

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

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

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

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

随机推荐

  1. Scapy 网段中ping扫描

    安装scapy pip3 install scapy-python3 交互式ip包构造 #scapy >>> ping = sr(IP(dst='202.100.1.1')/ICMP ...

  2. 软工1816 · Beta冲刺(6/7)

    团队信息 队名:爸爸饿了 组长博客:here 作业博客:here 组员情况 组员1(组长):王彬 过去两天完成了哪些任务 推进Web端完成开发 推进修改一些后端接口的逻辑 着手制作视频 接下来的计划 ...

  3. Leetcode题库——19.删除链表的倒数第 n 个节点【##】

    @author: ZZQ @software: PyCharm @file: removeNthFromEnd.py @time: 2018/9/26 21:56 说明:给定一个链表,删除链表的倒数第 ...

  4. Django Model基础操作

    关于设计django model django为我们集成了ORM对数据库进行操作,我们只需要进行定义model,django就会自动为我们创建表,以及表之间的关联关系 创建好一个django项目-首先 ...

  5. HDU 2109 Fighting for HDU

    http://acm.hdu.edu.cn/showproblem.php?pid=2109 Problem Description 在上一回,我们让你猜测海东集团用地的形状,你猜对了吗?不管结果如何 ...

  6. web_custom_request和web_submit_data

    网络上很多说明这2个函数区别的文章,我就从其他摘抄了内容,其中区别自己查看附录,我主要说明2点 (1)用web_custom_request提交请求如果是json,则会会使用关键字符{},但是{},是 ...

  7. BugScan插件编写高(gǎo)级(jī)教程

    声明:本文最先发布在:http://q.bugscan.net/t/353 转载请注明出处 有问题可以和我交流 邮件(Medici.Yan@gmail.com) 个人博客地址:http://www.c ...

  8. Java容器深入浅出之HashSet、TreeSet和EnumSet

    Java集合中的Set接口,定义的是一类无顺序的.不可重复的对象集合.如果尝试添加相同的元素,add()方法会返回false,同时添加失败.Set接口包括3个主要的实现类:HashSet.TreeSe ...

  9. LDA-Latent Dirichlet Allocation 学习笔记

    以下内容主要基于<Latent Dirichlet Allocation>,JMLR-2003一文,另加入了一些自己的理解,刚开始了解,有不对的还请各位指正. LDA-Latent Dir ...

  10. http站点如何启用为https站点?对收录的影响

    首先看一下百度官方对https站点的态度:百度开放收录https站点公告 百度搜索再次推出:全面支持https页面直接收录:另外从相关性的角度,百度搜索引擎认为权值相同的站点,采用https协议的页面 ...