bzoj千题计划158:bzoj2406: 矩阵(有源汇上下界可行流)
http://www.lydsy.com/JudgeOnline/problem.php?id=2406
.jpg)
设矩阵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: 矩阵(有源汇上下界可行流)的更多相关文章
- bzoj 2406 矩阵 —— 有源汇上下界可行流
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2406 这题,首先把题目那个式子的绝对值拆成两个限制,就成了网络流的上下界: 有上下界可行流原 ...
- bzoj 2406 矩阵——有源汇上下界可行流
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2406 二分答案.把 b 的 n 个行作为一排, m 个列作为一排,每行和每列之间连上下界为 ...
- 计蒜客 31447 - Fantastic Graph - [有源汇上下界可行流][2018ICPC沈阳网络预赛F题]
题目链接:https://nanti.jisuanke.com/t/31447 "Oh, There is a bipartite graph.""Make it Fan ...
- POJ2396 Budget [有源汇上下界可行流]
POJ2396 Budget 题意:n*m的非负整数矩阵,给出每行每列的和,以及一些约束关系x,y,>=<,val,表示格子(x,y)的值与val的关系,0代表整行/列都有这个关系,求判断 ...
- 有源汇上下界可行流(POJ2396)
题意:给出一个n*m的矩阵的每行和及每列和,还有一些格子的限制,求一组合法方案. 源点向行,汇点向列,连一条上下界均为和的边. 对于某格的限制,从它所在行向所在列连其上下界的边. 求有源汇上下界可行流 ...
- 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是该列(行)对另一行每个点都要满足约束条件 解法:先按无 ...
- ZOJ1994有源汇上下界可行流
http://fastvj.rainng.com/contest/236779#problem/G Description: n 行 m 列 给你行和 与 列和 然后有Q个限制,表示特定单元格元素大小 ...
随机推荐
- 编写了几个Java类,但是一直运行某一个class,这种是因为:main方法写错
编写了几个Java类,但是一直运行某一个class,这种是因为:main方法写错
- 手动解析Excel获取文件元数据
工作中有遇到需要获取上传的Excel文件的列明.最大行数.大小等元数据信息.通常做法是通过Apache的POI工具加载文件然后再读取行列进行处理.这种方法很大的弊端就是需要把excel文件加载到内存, ...
- 停止ipv6
在Centos5.5默认的状态下,ipv6是被启用的.因为我们不使用ipv6,所以,可以停止ipv6,以最大限度地保证安全和快速.首先确认一下ipv6是不是处于被启动的状态.[root@sample ...
- Struts1简单开发流程梳理
共享数据的4种范围MVC设计模式JSP model1.JSP model2struts实现MVC机制(ActionServlet.Action)struts-config.xml ActionServ ...
- 为什么选择 .NET Core?
为什么选择.NETCore? 学习新的开发框架是一项巨大的投资.您需要学习如何在新框架中编写,构建,测试,部署和维护应用程序.作为开发人员,有许多框架可供选择,很难知道什么是最适合的.即使您正在使用 ...
- 半夜思考之查漏补缺 , Spring 中的 Bean 继承机制
这里的继承 , 不是 Java 中的继承 , 下面就总结下 Bean继承与Java继承的区别: Spring 中的子类 Bean 和父 Bean 可以是不同类型 , 但是 Java 中的继承则可保证子 ...
- java 每一个对象都是根据hashCode区别的 每次返回不同的内存地址
可以通过hashCode比较对象,hashCode如果重写的话 返回的内存地址是一样的 则不能创建对象
- Maximum repetition substring POJ - 3693(重复次数最多的连续重复子串)
这题和SPOJ - REPEATS 一样 代码改一下就好了 这个题是求这个重复子串,还得保证字典序最小 巧妙运用sa 看这个 https://blog.csdn.net/queuelovestack ...
- 分享关于js解析URL中的参数的方法
function GetQueryString(name) { var reg = new RegExp("(^|&)" + name + "=([^&] ...
- 洛谷 P3698 [CQOI2017]小Q的棋盘 解题报告
P3698 [CQOI2017]小Q的棋盘 题目描述 小 Q 正在设计一种棋类游戏. 在小 Q 设计的游戏中,棋子可以放在棋盘上的格点中.某些格点之间有连线,棋子只能在有连线的格点之间移动.整个棋盘上 ...