分析:

  这道题乍一看……卧槽这都什么玩意……

  然后发现给了个A矩阵,要求一个可行的B矩阵,使得矩阵C=A-B的每一行的和的绝对值和每一列的和的绝对值的最大值最小……

  好拗口啊……

  什么最大值最小之类的,考的无非就是二分,我们二分一个答案,之后建图跑网络流。

  因为要判断是否合法,所以我们想到了用有上下界的可行流,在这里我们采用有源汇的有上下界可行流。

  我们把每行建点,第i行为xi,每列建点,第i列为yi,从S点到每行xi代表的点连边,容量为这一行的数值和±mid,从每一列yi代表的点向T点连边,容量为这一列的数值和±mid。(±mid为的是适应绝对值,-mid代表下界,+mid代表上界)

  还要把每一行对应的点xi分别向每一列代表的点yj连边,上下界为L,R,为的是满足B数组的L和R限制,因为在这里,第i行的点到第j列的点连边的流量,表示的就是B矩阵B(i,j)这个位置的值。

  这只是初步建图,我们要跑可行流,还要按要求将图转化,首先T到S连inf边,转化为无源汇上下界可行流。

  然后建出新的S,T点,按照规则将图进行变换。

  二分判定之后最终得出的结果,就是答案。

代码:

 1 #include<bits/stdc++.h>
 2 #define ms(a,x) memset(a,x,sizeof(a))
 3 using namespace std;
 4 const int N=205,M=200005,inf=0x3f3f3f3f;
 5 struct node{int y,z,nxt;}e[M];int S,T,tot;
 6 int L,R,n,m,a[N][N],sx[N],sy[N],h[N*5];
 7 int d[N*5],q[N*5],t[N*5],md,c=1,ans;
 8 void add(int x,int y,int z){
 9     e[++c]=(node){y,z,h[x]};h[x]=c;
10     e[++c]=(node){x,0,h[y]};h[y]=c;
11 } bool bfs(){
12     int f=1,t=0;ms(d,-1);
13     q[++t]=S;d[S]=0;
14     while(f<=t){
15         int x=q[f++];
16         for(int i=h[x],y;i;i=e[i].nxt)
17         if(d[y=e[i].y]==-1&&e[i].z)
18         d[y]=d[x]+1,q[++t]=y;
19     } return (d[T]!=-1);
20 } int dfs(int x,int f){
21     if(x==T) return f;int w,tmp=0;
22     for(int i=h[x],y;i;i=e[i].nxt)
23     if(d[y=e[i].y]==d[x]+1&&e[i].z){
24         w=dfs(y,min(e[i].z,f-tmp));
25         if(!w) d[y]=-1;e[i].z-=w;
26         e[i^1].z+=w;tmp+=w;
27         if(tmp==f) return f;
28     } return tmp;
29 } void dinic(){
30     while(bfs()) tot+=dfs(S,inf);
31 } bool pd(int lim){
32     ans=tot=0;int ad;c=1;ms(h,0);ms(t,0);
33     md=n+m+1;S=0;T=md+1;
34     for(int i=1;i<=n;i++){
35         int j=max(0,sx[i]-lim);
36         int k=sx[i]+lim;t[md]-=j;
37         t[i]+=j;add(md,i,k-j);//构建残量网络
38     } for(int i=1;i<=m;i++){
39         int j=max(0,sy[i]-lim);
40         int k=sy[i]+lim;t[md]+=j;
41         t[i+n]-=j;add(i+n,md,k-j);
42     } for(int i=1;i<=n;i++)
43     for(int j=1;j<=m;j++){
44         t[i]-=L;t[j+n]+=L;
45         add(i,j+n,R-L);
46     } for(int i=1;i<=md;i++)
47     if(t[i]){
48         if(t[i]>0) add(S,i,t[i]),
49         ans+=t[i];else add(i,T,-t[i]);
50     } dinic();ans-=tot;return !ans;
51 } int main(){
52     scanf("%d%d",&n,&m);
53     for(int i=1;i<=n;i++)
54     for(int j=1;j<=m;j++)
55     scanf("%d",&a[i][j]),
56     sx[i]+=a[i][j],sy[j]+=a[i][j];
57     scanf("%d%d",&L,&R);
58     int l=0,r=2e5,pos;
59     while(l<=r){
60         int mid=l+r>>1;
61         if(pd(mid)) pos=mid,r=mid-1;
62         else l=mid+1;
63     } printf("%d\n",pos);
64     return 0;
65 }

有上下界可行流

转载于:https://www.cnblogs.com/Alan-Luo/p/10256512.html

BZOJ 2406 LuoguP4194 矩阵 有上下界可行流相关推荐

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

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

  2. loj#115. 无源汇有上下界可行流

    \(\color{#0066ff}{ 题目描述 }\) 这是一道模板题. \(n\) 个点,\(m\) 条边,每条边 \(e\) 有一个流量下界 \(\text{lower}(e)\) 和流量上界 \ ...

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

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

  4. 无源汇有上下界可行流(网络流进阶)

    无源汇有上下界可行流(也就是循环流) 模型:一个网络,求出一个流,使得每条边的流量必须>=Li且<=Hi, 每个点必须满足总流入量=总流出量(流量守恒)(这个流的特点是循环往复,无始无终) ...

  5. 一篇网络流 基本模型超全总结(最大流 费用流 多源汇最大流 上下界可行流) 思路+代码模板

    文章目录 一.网络流与最大流 二.网络流三个基本性质 三.重要定义定理 四.最大流算法 <Ⅰ> Edmonds-Karp算法(EK算法) 1.EK算法 2.算法思想: 3.代码模板 4.模 ...

  6. 网络流__4 上下界可行流

    网络流 __4 上下界可行流 对于容量有上下界规范的网络流问题 无源汇上下界可行流 n个点m条边的有向图,每条边有一个流量下界和流量上界规范,求是否存在一个可行流 设原网络为(G,F),变换后网络为( ...

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

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

  8. 【zoj2314】Reactor Cooling 有上下界可行流

    题目描述 The terrorist group leaded by a well known international terrorist Ben Bladen is buliding a nuc ...

  9. BZOJ2406矩阵——有上下界的可行流+二分答案

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

最新文章

  1. TCP三次握手和四次挥手图示
  2. Android内存管理
  3. Java的数据类型的挑选
  4. 利用JavaScript选择GridView行
  5. 可实现自动设置尺寸的图片上传类
  6. [html] 你了解HTML5的download属性吗?
  7. java config 类_Spring ----JavaConfig类代替XML配置Bean
  8. python 降维 聚类_比PCA降维更高级——(R/Python)t-SNE聚类算法实践指南
  9. Windows phone 7 之ToggleSwitch
  10. ElasticSearch遇到问题
  11. HtmlHelper类在View中替代了纯HTML代码
  12. 7z源码的编译与使用
  13. JFreechart从入门到放弃
  14. 模电笔记(按知识点整理版)
  15. centos 7.6编译安装nginx
  16. 不用编程语言自带函数,你会如何实现计算平方根
  17. 机器学习:PageRank
  18. C实现 费氏查找算法
  19. 程序员能纯靠技术渡过中年危机吗?
  20. ID3西瓜决策树python实现

热门文章

  1. 未来架构师的平台战略范例(2)_集装箱
  2. Django最新版(1.10.5)在SAE上面部署流程
  3. 类对象工厂设计模式(Factory Pattern)
  4. VISTA三步共享文件夹
  5. Python实战之多线程编程threading.Thread
  6. mysql xml生成工具_mybatis-generator 代码自动生成工具
  7. L1-080 乘法口诀数列 (20 分)-PAT 团体程序设计天梯赛 GPLT
  8. 蓝桥杯 ADV-61 算法提高 矩阵乘方
  9. 【C++ 与 STL】集合:set
  10. oracle计算两个日期的时间差时分秒