[上下界网络流][二分] Bzoj P2406 矩阵

题目描述

输入输出格式

输入格式:

 

第一行两个数n、m,表示矩阵的大小。

接下来n行,每行m列,描述矩阵A。

最后一行两个数L,R。

 

输出格式:

 

第一行,输出最小的答案;

 

输入输出样例

输入样例#1:
2 2
0 1
2 1
0 1
输出样例#1:
1

说明

对于100%的数据满足N,M<=200,0<=L<=R<=1000,0<=A_{ij}Aij<=1000

 

题解

  • 这题的转换实在是太TM的神奇了!!!
  • 首先,题目要求的其实是最大值最小,那么我们可以二分,将其转换为判断性问题
  • 乍一看这个式子,一脸懵逼,再乍一看,其实就是要我们“最小化每行每列所有元素与给定矩阵差的和的绝对值中的最大值”
  • 然后先设h[i]为第i行的和,l[i]为第i列的和
  • 那么如果要满足二分出来的mid,那么一定要满足B矩阵的第i行总和为[r[i]-mid,mid+r[i]],同列的话也是一样的
  • 那么我们就可以把每列每行的看成一个点,原点向每个行点连边,上下界为[r[i]-mid,mid+r[i]],列点向汇点连边,上下界为[c[i]-mid,mid+c[i]]
  • 然后行列之间连边上下界为[L,R],这样的话,问题就可以转换为是否存在二分图中是否存在一个可行流
  • 那么跑一遍上下界网络流就好了

代码

 1 #include <cstdio>
 2 #include <iostream>
 3 #include <cstring>
 4 #include <queue>
 5 #include <algorithm>
 6 using namespace std;
 7 const int N=510;
 8 const int inf=0x3f3f3f3f;
 9 int n,m,cnt,s,t,S,T,head[N],dis[N],cur[N],d[N],h[N],l[N],L,R,num[N][N];
10 struct edge{int to,from,v;}e[N*N*2];
11 queue<int> Q;
12 void insert(int x,int y,int v)
13 {
14     e[++cnt].to=y,e[cnt].from=head[x],e[cnt].v=v,head[x]=cnt;
15     e[++cnt].to=x,e[cnt].from=head[y],e[cnt].v=0,head[y]=cnt;
16 }
17 int dfs(int x,int maxf)
18 {
19     if (x==T||!maxf) return maxf;
20     int ret=0;
21     for (int &i=cur[x];i;i=e[i].from)
22         if (e[i].v&&dis[e[i].to]==dis[x]+1)
23         {
24             int f=dfs(e[i].to,min(e[i].v,maxf-ret));
25             e[i].v-=f,e[i^1].v+=f,ret+=f;
26             if (maxf==ret) break;
27         }
28     return ret;
29 }
30 bool bfs()
31 {
32     for (int i=s;i<=T;i++) dis[i]=0;
33     while (!Q.empty()) Q.pop();
34     dis[S]=1,Q.push(S);
35     while (!Q.empty())
36     {
37         int u=Q.front(); Q.pop();
38         for (int i=head[u];i;i=e[i].from)
39             if (e[i].v&&!dis[e[i].to])
40             {
41                 dis[e[i].to]=dis[u]+1;
42                 if (e[i].to==T) return 1;
43                 Q.push(e[i].to);
44             }
45     }
46     return 0;
47 }
48 int dinic()
49 {
50     int ans=0;
51     while (bfs())
52     {
53         for (int i=0;i<=T;i++) cur[i]=head[i];
54         ans+=dfs(S,inf);
55     }
56     return ans;
57 }
58 bool check(int x)
59 {
60     cnt=1,memset(d,0,sizeof(d)),memset(head,0,sizeof(head)),s=0,t=n+m+1,S=n+m+2,T=n+m+3;
61     insert(t,s,inf);
62     for (int i=1;i<=n;i++)
63         for (int j=1;j<=m;j++)
64             insert(i,j+n,R-L),d[i]-=L,d[j+n]+=L,num[i][j]=cnt;
65     for (int i=1;i<=n;i++)
66     {
67         int p=max(0,h[i]-x),q=x+h[i];
68         insert(s,i,q-p),d[s]-=p,d[i]+=p;
69     }
70     for (int i=1;i<=m;i++)
71     {
72         int p=max(0,l[i]-x),q=x+l[i];
73         insert(i+n,t,q-p),d[i+n]-=p,d[t]+=p;
74     }
75     int tot=0;
76     for (int i=s;i<=t;i++) if (d[i]>0) insert(S,i,d[i]),tot+=d[i]; else if (d[i]<0) insert(i,T,-d[i]);
77     return dinic()==tot;
78 }
79 int main()
80 {
81     scanf("%d%d",&n,&m);
82     for (int i=1,x;i<=n;i++) for (int j=1;j<=m;j++) scanf("%d",&x),h[i]+=x,l[j]+=x;
83     scanf("%d%d",&L,&R);
84     int l=0,r=200000;
85     while (l<=r)
86     {
87         int mid=l+r>>1;
88         if (check(mid)) r=mid-1; else l=mid+1;
89     }
90     printf("%d",r+1);
91 }

 

转载于:https://www.cnblogs.com/Comfortable/p/10304186.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/249755.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

记录自己的nest学习之旅

.a r 转载于:https://www.cnblogs.com/smzd/p/10978807.html

PYTHON 爬虫笔记七:Selenium库基础用法

知识点一&#xff1a;Selenium库详解及其基本使用 什么是Selenium selenium 是一套完整的web应用程序测试系统&#xff0c;包含了测试的录制&#xff08;selenium IDE&#xff09;,编写及运行&#xff08;Selenium Remote Control&#xff09;和测试的并行处理&#xff08;Sele…

pyqt5界面切换

#主要的思路就是创建两个frame&#xff08;如果有两个以上同理&#xff09;使用setVisible()函数显示或者隐藏frame 参数是bool值import sys from PyQt5.QtWidgets import * from PyQt5.QtCore import * from PyQt5.QtGui import *class logindialog(QDialog):def __init__(sel…

mac 完全卸载vscode

原文分隔线while writing go this morning, I found that the wrong code are not under lined by red line This is really difficult for me and time consuming to keep writing. After 1 hour of wasting time trying to figure out what happened, I decide to kill it al…

RPC简介及框架选择

简单介绍RPC协议及常见框架&#xff0c;对比传统restful api和RPC方式的优缺点。常见RPC框架&#xff0c;gRPC及序列化方式Protobuf等 HTTP协议 http协议是基于tcp协议的&#xff0c;tcp协议是流式协议&#xff0c;包头部分可以通过多出的\r\n来分界&#xff0c;包体部分如何分…

CSS3的calc()使用

什么是calc()? 学习calc()之前&#xff0c;我们有必要先知道calc()是什么&#xff1f;只有知道了他是个什么东东&#xff1f;在实际运用中更好的使用他。 calc()从字面我们可以把他理解为一个函数function。其实calc是英文单词calculate(计算)的缩写&#xff0c;是css3的一个新…

typescript 类型映射 (ReadOnly、Partial)

有时候需要一个类型&#xff0c;是依赖于上一个类型但是&#xff0c;对属性的要求去不同interface Person{name: string;agent: number; } type Person2 Readonly<Person>; type Person3 Partial<Person>; class Test {run() {let person: Person {name: dd,age…

JAVA中几种常用的RPC框架介绍

RPC是远程过程调用的简称&#xff0c;广泛应用在大规模分布式应用中&#xff0c;作用是有助于系统的垂直拆分&#xff0c;使系统更易拓展。Java中的RPC框架比较多&#xff0c;各有特色&#xff0c;广泛使用的有RMI、Hessian、Dubbo等。RPC还有一个特点就是能够跨语言&#xff0…

C#中的多线程 - 同步基础

C#中的多线程 - 同步基础 C#中的多线程 - 同步基础 1同步概要在第 1 部分&#xff1a;基础知识中&#xff0c;我们描述了如何在线程上启动任务、配置线程以及双向传递数据。同时也说明了局部变量对于线程来说是私有的&#xff0c;以及引用是如何在线程之间共享&#xff0c;允许…

WC2019 自闭记

不咕了 Day 1 2019/1/24 辣么快就到冬令营了&#xff0c;还沉迷于被柿子吊打的状态的菜鸡一时半会还反应不过来。我们学校这次分头去的冬令营&#xff0c;差点上不了车。这次做的动车居然直达广州&#xff0c;强啊。 然鹅还是到太晚&#xff0c;没饭吃了。路上花了15大洋买了个…

v-slot vue2.6新增指令使用指南

子组件 <template><div class"wrapper"><slot name"demo" :msg"msg" text"this is a slot demo , ">this is demo slot.</slot></div> </template><script>export default {components: {…

跨语言RPC框架Thrift详解

一、 概念 Apache的Thrift软件框架&#xff0c;是用来进行可伸缩的、跨语言的服务开发&#xff0c;它通过一个代码生成引擎来构建高效、无缝的服务&#xff0c;这些服务能够实现跨语言调度&#xff0c;目前支持的语言有&#xff1a; C, Java, Python, PHP, Ruby, Erlang, Perl,…

小知识

1.时间格式的处理 new Date().format(yyyy-MM-dd hh:mm:ss) 2.保留两位小数的方法 element.recTime element.recTime.toFixed(2) 3.如何判断一个对象为空的方法 JSON.stringify(this.getEcho) ! "{}" 4.判断时间是否为标准格式的方法 (this.formValidate.outDateti…

增加标 和增加其内容

create table student( sno varchar(20) not null comment学号, sname varchar(20) not null comment学生姓名, ssex varchar(20) not null comment学生性别, sbirthday datetime comment学生出生年月, class varchar(20) comment 学生所在班级, primary key…

RPC服务和HTTP服务对比

很长时间以来都没有怎么好好搞清楚RPC&#xff08;即Remote Procedure Call&#xff0c;远程过程调用&#xff09;和HTTP调用的区别&#xff0c;不都是写一个服务然后在客户端调用么&#xff1f;这里请允许我迷之一笑~Naive&#xff01;本文简单地介绍一下两种形式的C/S架构&am…

MTK-TP(电阻屏校准程序ts_lib移植)

现今的项目中已经很少有使用电阻TP&#xff0c;但总有些奇怪的需求。如果项目中遇到需要校准电阻屏如何保证较快且较稳的调试TP呢。这里介绍使用ts_lib库来进行调试。 当然也可以使用一些常见的校准算法&#xff0c;采集5点&#xff0c;但最终的公式应该是不变的&#xff1a; X…

mac vscode 实用快捷键

cmddel:光标左边删到头 cmdfndel:光标右侧删到头转载于:https://www.cnblogs.com/smzd/p/11474488.html

ONENET读取与控制麒麟座MINI开发板LED状态

硬件 麒麟座MINI开发板V1.4 嵌入式软件 OneNET_Demo_ESP8266_EDP_Led 工程修改内容 led.c文件修改 函数LED_Init&#xff0c;mini开发板LED所在GPIO为PB6、PB7、PB8、PB9 函数LED_GetValue&#xff0c;mini开发板LED状态与IO口状态相反 /** * brief LED指示灯初始化函数**/v…

洛谷 - P1217 - 回文质数 - 枚举

https://www.luogu.org/problemnew/show/P1217 考虑暴力生成所有的回文数然后再判断是不是质数。注意个位的选择实际上只有4种。所以是 $4*10^3*10^34*10^6$ &#xff0c;完全充裕的复杂度。 #include<bits/stdc.h> using namespace std; #define ll long longint a,b; v…

git commit之后,想撤销commit

写完代码后&#xff0c;我们一般这样git add . //添加所有文件git commit -m "本功能全部完成"执行完commit后&#xff0c;想撤回commit&#xff0c;怎么办&#xff1f;这样凉拌&#xff1a;git reset --soft HEAD^这样就成功的撤销了你的commit注意&#xff0c;仅仅…