BZOJ 2406 矩阵(二分+有源汇上下界可行流)

时间:2022-09-22 23:13:02

题意

BZOJ 2406 矩阵(二分+有源汇上下界可行流)

题解

二分答案+可行流判断。

模板题。

CODE

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cctype>
#include <queue>
using namespace std;
template<class T>inline void read(T &x) {
char ch; int flg = 1; while(!isdigit(ch=getchar()))if(ch=='-')flg=-flg;
for(x=ch-'0';isdigit(ch=getchar());x=x*10+ch-'0');x*=flg;
}
const int MAXN = 420;
const int MAXM = 50005;
const int inf = 1000000000;
int n, m, L, R, out[MAXN], in[MAXN];
int info[MAXN], fir[MAXN], to[MAXM<<1], nxt[MAXM<<1], c[MAXM<<1], cnt = 1;
inline void link(int u, int v, int cc, int rc=0) {
to[++cnt] = v; nxt[cnt] = fir[u]; fir[u] = cnt; c[cnt] = cc;
to[++cnt] = u; nxt[cnt] = fir[v]; fir[v] = cnt; c[cnt] = rc;
}
int S, T, dis[MAXN];
queue<int>q; bool vis[MAXN];
bool bfs() {
memset(dis, -1, sizeof dis);
dis[S] = 0; q.push(S);
while(!q.empty()) {
int u = q.front(); q.pop();
for(int i = fir[u]; i; i = nxt[i])
if(c[i] && !~dis[to[i]])
dis[to[i]] = dis[u] + 1, q.push(to[i]);
}
return ~dis[T];
}
int aug(int u, int Max) {
if(u == T) return Max;
vis[u] = 1; int flow = 0, delta;
for(int v, &i = info[u]; i; i = nxt[i])
if(c[i] && !vis[v=to[i]] && dis[v] == dis[u] + 1 && (delta=aug(v, min(Max-flow, c[i])))) {
c[i] -= delta, c[i^1] += delta, flow += delta;
if(flow == Max) break;
}
vis[u] = 0; return flow;
}
int Maxflow(int s, int t) {
int re = 0; S = s, T = t;
while(bfs()) memcpy(info, fir, sizeof info), re += aug(S, inf);
return re;
}
int rs[205], cs[205];
int rid[205], cid[205];
inline void add(int u, int v, int ll, int rr) {
link(u, v, rr-ll);
in[v] += ll;
out[u] += ll;
}
inline bool chk(int mid) {
memset(in, 0, sizeof in);
memset(out, 0, sizeof out);
memset(fir, 0, sizeof fir); cnt = 1;
int tot = 0, s = ++tot, t = ++tot;
for(int i = 1; i <= n; ++i) rid[i] = ++tot, add(s, rid[i], max(rs[i]-mid, 0), rs[i]+mid);
for(int i = 1; i <= m; ++i) cid[i] = ++tot, add(cid[i], t, max(cs[i]-mid, 0), cs[i]+mid);
for(int i = 1; i <= n; ++i)
for(int j = 1; j <= m; ++j) add(rid[i], cid[j], L, R);
int ss = ++tot, tt = ++tot, sum = 0;
for(int i = 1; i < ss; ++i) {
if(in[i]>out[i]) link(ss, i, in[i]-out[i]), sum += in[i]-out[i];
if(in[i]<out[i]) link(i, tt, out[i]-in[i]);
}
link(t, s, inf, 0);
sum -= Maxflow(ss, tt);
return !sum;
}
int main () {
read(n), read(m);
for(int i = 1; i <= n; ++i)
for(int j = 1, x; j <= m; ++j)
read(x), rs[i] += x, cs[j] += x;
read(L), read(R);
int l = 0, r = 1000*max(n,m), mid;
while(l < r) {
mid = (l + r) >> 1;
if(chk(mid)) r = mid;
else l = mid+1;
}
printf("%d\n", l);
}

BZOJ 2406 矩阵(二分+有源汇上下界可行流)的更多相关文章

  1. bzoj千题计划158:bzoj2406&colon; 矩阵(有源汇上下界可行流)

    http://www.lydsy.com/JudgeOnline/problem.php?id=2406 设矩阵C=A-B 最小化 C 一行或一列和的最大值 整体考虑一行或者一列的和 二分最大值 这样 ...

  2. bzoj 2406&colon; 矩阵【二分&plus;有源汇上下界可行流】

    最大值最小,所以考虑二分 |Σaij-Σbij|<=mid,所以Σbij的上下界就是(Σaij-mid,Σaij+mid) 考虑建有上下界网络,连接(s,i,Σaik-mid,Σaik+mid) ...

  3. POJ2396 Budget &lbrack;有源汇上下界可行流&rsqb;

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

  4. 有源汇上下界可行流&lpar;POJ2396&rpar;

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

  5. 计蒜客 31447 - Fantastic Graph - &lbrack;有源汇上下界可行流&rsqb;&lbrack;2018ICPC沈阳网络预赛F题&rsqb;

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

  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. bzoj 2406 矩阵 —— 有源汇上下界可行流

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

随机推荐

  1. MailKit系列之---查询SearchQuery

    对于邮件的唯一Id查询,由于MailKit提供了大量的方法,无法完全讲解完全,所以这里只选择几个来介绍. MailKit通过方法folder.Search来查询邮件的唯一Id,参数是一个SearchQ ...

  2. Emacs使用projectile-rails 插件注意事项

    插件地址 https://github.com/asok/projectile-rails 我自己使用rbenv这个ruby版本控制工具来,管理下载ruby,但是他不是全局安装ruby之类的gem,如 ...

  3. JQuery获取元素的方法总结

    JQuery获取元素的方法总结 一.说明   获取元素的方法分为两种:jQuery选择器.jQuery遍历函数. 做个总结,巩固下知识. 二.获取本身 1.只需要一种jQuery选择器   选择器 实 ...

  4. DI 之 3&period;2 循环依赖 &lpar;伍&rpar;

    3.2.1  什么是循环依赖 循环依赖就是循环引用,就是两个或多个Bean相互之间的持有对方,比如CircleA引用CircleB,CircleB引用CircleC,CircleC引用CircleA, ...

  5. hbase常用运维命令

    一,基本命令: 建表:create 'testtable','coulmn1','coulmn2' 也可以建表时加coulmn的属性如:create 'testtable',{NAME => ' ...

  6. Spring REST

    前面介绍过Spring的MVC结合不同的view显示不同的数据,如:结合json的 view显示json.结合xml的view显示xml文档.那么这些数据除了在WebBrowser中用JavaScri ...

  7. sleep和wait的区别

    sleep指线程被调用时,占着CPU不工作,形象地说明为“占着CPU睡觉”,此时,系统的CPU部分资源被占用,其他线程无法进入,会增加时间限制.wait指线程处于进入等待状态,形象地说明为“等待使用C ...

  8. oracle&lowbar;创建表空间&lowbar;临时表空间&lowbar;修改表空间&lowbar;以及自增长

    管理员用户登录oracle数据库 [oracle@DBORACLE ~]$ sqlplus / as sysdba SQL*Plus: Release 11.2.0.4.0 Production on ...

  9. &lbrack;转&rsqb;Maven与nexus

    开始在使用Maven时,总是会听到nexus这个词,一会儿maven,一会儿nexus,当时很是困惑,nexus是什么呢,为什么它总是和maven一起被提到呢? 我们一步一步来了解吧. 一.了解Mav ...

  10. codeforces 975C Valhalla Siege

    题意: 有n个巫师站成一列,每个巫师有自己的血量. 一个人射箭攻击他们,每次造成若干点伤害,巫师按照给定的顺序承受伤害,如果伤害大了,那么死掉,伤害落到下一个巫师身上. 如果一轮攻击之后,所有的巫师都 ...