bzoj 2406 矩阵 —— 有源汇上下界可行流
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2406
这题,首先把题目那个式子的绝对值拆成两个限制,就成了网络流的上下界;
有上下界可行流原来只需要先流出下界,然后用超级源汇补足即可,原来的汇点向源点连一条下界0上界 inf 的边,就也流量守恒了;
竟然是枚举出错了囧,因为平时写的 S=0,所以枚举就是 S~T,但这回写的 S=n+1,枚举应该变成 1~T 啊!
代码如下:
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
using namespace std;
int const xn=,xm=1e5+,inf=1e9;
int n,m,si[xn],sj[xn],hd[xn],ct=,to[xm],nxt[xm],c[xm],dis[xn];
int tmp[xn],a[xn][xn],cur[xn],L,R,S,T,SS,TT;
queue<int>q;
int rd()
{
int ret=,f=; char ch=getchar();
while(ch<''||ch>''){if(ch=='-')f=; ch=getchar();}
while(ch>=''&&ch<='')ret=ret*+ch-'',ch=getchar();
return f?ret:-ret;
}
void ade(int x,int y,int z){to[++ct]=y; nxt[ct]=hd[x]; hd[x]=ct; c[ct]=z;}
void add(int x,int y,int z){ade(x,y,z); ade(y,x,);}
bool bfs(int s,int t)
{
memset(dis,,sizeof dis);
dis[s]=; q.push(s);
while(q.size())
{
int x=q.front(); q.pop();
for(int i=hd[x],u;i;i=nxt[i])
if(!dis[u=to[i]]&&c[i])dis[u]=dis[x]+,q.push(u);
}
return dis[t];
}
int dfs(int x,int fl,int t)
{
if(x==t)return fl;
int ret=;
for(int &i=cur[x],u;i;i=nxt[i])
{
if(dis[u=to[i]]!=dis[x]+||!c[i])continue;
int tmp=dfs(u,min(fl-ret,c[i]),t);
if(!tmp)dis[u]=;
c[i]-=tmp; c[i^]+=tmp;
ret+=tmp; if(ret==fl)break;
}
return ret;
}
int dinic(int s,int t)
{
int ret=;
while(bfs(s,t))
{
memcpy(cur,hd,sizeof hd);
ret+=dfs(s,inf,t);
}
return ret;
}
bool ck(int mid)
{
ct=; memset(hd,,sizeof hd);
memset(tmp,,sizeof tmp);
for(int i=;i<=n;i++)
{
int l=max(,si[i]-mid),r=si[i]+mid;
add(S,i,r-l); tmp[S]-=l; tmp[i]+=l;
}
for(int j=;j<=m;j++)
{
int x=n+j,l=max(,sj[j]-mid),r=sj[j]+mid;
add(x,T,r-l); tmp[x]-=l; tmp[T]+=l;
}
for(int i=;i<=n;i++)
for(int j=;j<=m;j++)
{
add(i,n+j,R-L); tmp[i]-=L; tmp[n+j]+=L;
}
add(T,S,inf); int goal=;
for(int i=;i<=T;i++)//!S
if(tmp[i]>)add(SS,i,tmp[i]),goal+=tmp[i];
else if(tmp[i]<)add(i,TT,-tmp[i]);
return goal==dinic(SS,TT);
}
int main()
{
n=rd(); m=rd(); int l=,r=;
for(int i=;i<=n;i++)
for(int j=;j<=m;j++)
a[i][j]=rd(),si[i]+=a[i][j],sj[j]+=a[i][j],r+=a[i][j];
L=rd(); R=rd();
int ans; S=n+m+; T=n+m+; SS=n+m+; TT=n+m+;
while(l<=r)
{
int mid=((l+r)>>);
if(ck(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 二分答案.把 b 的 n 个行作为一排, m 个列作为一排,每行和每列之间连上下界为 ... 
- 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个限制,表示特定单元格元素大小 ... 
随机推荐
- linux c编程:信号(三) sigprocmask和sigpending函数
			信号源为目标进程产生了一个信号,然后由内核来决定是否要将该信号传递给目标进程.从信号产生到传递给目标进程的流程图如下图所示: 进程可以阻塞信号的传递.当信号源为目标进程产生了一个信号之后,内核会执行依 ... 
- wechat JS-SKD (getLoaction) 定位显示百度map
			<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta name ... 
- flex  组件重写  组件生命周期
			AS方式重写组件常规步骤 1.如果有必要,为组件创建所有基于标记(tag-based)的皮肤(skins) 2.创建ActionScript类文件 ⑴从一个基类扩展,比如UIComponent或者其他 ... 
- Android系统篇之—-编写系统服务并且将其编译到系统源码中【转】
			本文转载自:http://www.wjdiankong.cn/android%E7%B3%BB%E7%BB%9F%E7%AF%87%E4%B9%8B-%E7%BC%96%E5%86%99%E7%B3% ... 
- mono上运行程序常见问题
			1. System.BadImageFormatException: Invalid method header local vars signature token 0x 65d5b2File na ... 
- sql优化,索引学习
- MacacaUIFinder元素查找器
			MacacaUIFinder元素查找器 1. 这是什么? 这是一个用JavaSwing写的Macaca元素查找器,方便测试的小伙伴们定位元素,如果觉得不错,还请点个Star鼓励下,嘿嘿. 地址:htt ... 
- 关于HttpURLConnection测试servlet
			把数据POST给服务端后,一定要读取服务端的响应,这是必须的,否则服务端不处理.其实发送的数据被服务端接收后在缓冲中,并不是立即处理的.然后服务端把响应码和内容等反回给客户端.如果客户端只发送不接受, ... 
- mvc购物车项目(2)
			为了避免数据冗余,我们可以把共同的信息,抽出建立一个单独的表,把不是共有的信息,建立一张单独表. 订单表分为两个表 create table orders( id number primary key ... 
- 前端框架之VUE
			vue学习[第1篇]:vue之指令 vue学习[第2篇]:es6简单介绍 vue学习[第3篇]:vue之node.js的简单介绍 vue学习[第4篇]:vue 之webpack打包工具的使用 vue学 ... 
