bzoj 2406 二分+有源有汇上下界网络流可行流判定
弱爆了,典型的行列建模方式,居然想不到,题做少了,总结少了。。。。。。
二分答案mid
s----------------------->i行----------------------->j列----------------------------->t
[si-mid,si+mid] [L,R] [s[j]-mid,s[j]+mid]
即对每一行建一个点,每一列建一个点,用边来表示某一行某一列上的东西.
这种建模方式一般要整体考虑行或列的某些信息.
/**************************************************************
Problem: 2406
User: idy002
Language: C++
Result: Accepted
Time:396 ms
Memory:4576 kb
****************************************************************/ #include <cstdio>
#include <cstring>
#define min(a,b) ((a)<(b)?(a):(b))
#define oo 0x3f3f3f3f
#define N 510
#define S 100010 struct Dinic {
int n, src, dst;
int head[N], dest[S], flow[S], next[S], etot;
int dep[N], cur[N], qu[N], bg, ed; void init( int n, int src, int dst ) {
memset( head, -, sizeof(head) );
etot = ;
this->n = n;
this->src = src;
this->dst = dst;
}
void adde( int u, int v, int f ) {
// fprintf( stderr, "Dinic::adde( %d %d %d )\n", u, v, f );
next[etot]=head[u]; flow[etot]=f; dest[etot]=v; head[u]=etot++;
next[etot]=head[v]; flow[etot]=; dest[etot]=u; head[v]=etot++;
}
bool bfs() {
memset( dep, , sizeof(dep) );
qu[bg=ed=] = src;
dep[src] = ;
while( bg<=ed ) {
int u=qu[bg++];
for( int t=head[u]; ~t; t=next[t] ) {
int v=dest[t], f=flow[t];
if( f && !dep[v] ) {
dep[v] = dep[u]+;
qu[++ed] = v;
}
}
}
return dep[dst];
}
int dfs( int u, int a ) {
if( u==dst || a== ) return a;
int remain=a, past=, na;
for( int &t=cur[u]; ~t; t=next[t] ) {
int v=dest[t], &f=flow[t], &vf=flow[t^];
if( f && dep[v]==dep[u]+ && (na=dfs(v,min(remain,f))) ) {
f -= na;
vf += na;
remain -= na;
past += na;
if( !remain ) break;
}
}
return past;
}
int maxflow() {
int f = ;
while( bfs() ) {
for( int u=; u<=n; u++ ) cur[u]=head[u];
f += dfs( src, oo );
}
// fprintf( stderr, "maxflow() = %d\n", f );
return f;
}
};
struct TopBot {
int n;
int head[N], dest[S], top[S], bot[S], next[S], etot;
int sin[N], sout[N];
Dinic D;
void init( int n ) {
this->n = n;
etot = ;
memset( head, , sizeof(head) );
memset( sin, , sizeof(sin) );
memset( sout, , sizeof(sout) );
}
void adde( int u, int v, int t, int b ) {
// fprintf( stderr, "TopBot::adde( %d %d [%d,%d] )\n", u, v, b, t );
etot++;
dest[etot] = v;
top[etot] = t;
bot[etot] = b;
next[etot] = head[u];
head[u] = etot;
sin[v] += b;
sout[u] += b;
}
bool ok() {
int src=n+, dst=n+;
D.init( n+, src, dst );
for( int u=; u<=n; u++ )
for( int t=head[u]; t; t=next[t] ) {
int v=dest[t];
D.adde( u, v, top[t]-bot[t] );
}
int sumf = ;
for( int u=; u<=n; u++ ) {
if( sin[u]>sout[u] )
D.adde( src, u, sin[u]-sout[u] );
else if( sin[u]<sout[u] ) {
D.adde( u, dst, sout[u]-sin[u] );
sumf += sout[u]-sin[u];
}
}
// fprintf( stderr, "sumf=%d\n", sumf );
return D.maxflow()==sumf;
}
}T; int n, m;
int w[N][N], L, R;
int s[][N]; bool ok( int mid ) {
int src = n+m+, dst = n+m+;
int st=, sb=;
T.init(dst);
for( int i=; i<=n; i++ ) {
int t=s[][i]+mid, b=s[][i]-mid;
b = b< ? : b;
T.adde( src, i, t, b );
st += t;
sb += b;
}
for( int i=; i<=n; i++ )
for( int j=; j<=m; j++ )
T.adde( i, n+j, R, L );
for( int i=; i<=m; i++ ) {
int t=s[][i]+mid, b=s[][i]-mid;
b = b< ? : b;
T.adde( n+i, dst, t, b );
}
T.adde( dst, src, st, sb );
return T.ok();
}
int main() {
scanf( "%d%d", &n, &m );
for( int i=; i<=n; i++ )
for( int j=; j<=m; j++ ) {
scanf( "%d", &w[i][j] );
s[][i] += w[i][j];
s[][j] += w[i][j];
}
scanf( "%d%d", &L, &R );
int lf=, rg=;
while( lf<rg ) {
int mid=lf+((rg-lf)>>);
if( ok(mid) ) rg=mid;
else lf=mid+;
}
printf( "%d\n", lf );
}
bzoj 2406 二分+有源有汇上下界网络流可行流判定的更多相关文章
- sgu 194 上下界网络流可行流判定+输出可行流
#include <cstdio> #include <cstring> #define min(a,b) ((a)<(b)?(a):(b)) #define oo 0x ...
- POJ 2396 Budget(有源汇上下界网络流)
Description We are supposed to make a budget proposal for this multi-site competition. The budget pr ...
- ACM-ICPC 2018 沈阳赛区网络预赛 F. Fantastic Graph (贪心或有源汇上下界网络流)
"Oh, There is a bipartite graph.""Make it Fantastic."X wants to check whether a ...
- HDU 4940 Destroy Transportation system(无源汇上下界网络流)
Problem Description Tom is a commander, his task is destroying his enemy’s transportation system. Le ...
- [ACdream 1211 Reactor Cooling]无源无汇有上下界的可行流
题意:无源无汇有上下界的可行流 模型 思路:首先将所有边的容量设为上界减去下界,然后对一个点i,设i的所有入边的下界和为to[i],所有出边的下界和为from[i],令它们的差为dif[i]=to[i ...
- LOJ #116 有源汇点有上下界的最大流
先连一条从汇点到源点的容量为INF的边,将其转化成无源汇点有上下界的可行流,判断是否可行 若可行的话删掉超级源点和超级汇点,再跑一遍最大流即可 #include <iostream> #i ...
- ZOJ 2314 带上下界的可行流
对于无源汇问题,方法有两种. 1 从边的角度来处理. 新建超级源汇, 对于每一条有下界的边,x->y, 建立有向边 超级源->y ,容量为x->y下界,建立有向边 x-> 超级 ...
- HDU Destroy Transportation system(有上下界的可行流)
前几天正看着网络流,也正研究着一个有上下界的网络流的问题,查看了很多博客,觉得下面这篇概括的还是相当精确的: http://blog.csdn.net/leolin_/article/details/ ...
- ACM-ICPC 2018 沈阳赛区网络预赛 F Fantastic Graph(贪心或有源汇上下界网络流)
https://nanti.jisuanke.com/t/31447 题意 一个二分图,左边N个点,右边M个点,中间K条边,问你是否可以删掉边使得所有点的度数在[L,R]之间 分析 最大流不太会.. ...
随机推荐
- Sicily 1211. 商人的宣传
题目链接:http://soj.me/1211 Description Bruce是K国的商人,他在A州成立了自己的公司,这次他的公司生产出了一批性能很好的产品,准备宣传活动开始后的第L天到达B州进行 ...
- 与JavaWeb有关的故事(Web请求与Java IO)
作为一名后端屌丝程序员,对算法.并发.性能乐此不疲.但是,随着年龄和阅历的增加,显然叶落而不知秋的心态是不太能混了.尤其是,某T面试官在明知我是后端,且明确表示对HTTP协议不太熟的情况下,强行让我解 ...
- 【Linux】Linux基本命令扫盲【转】
转自:http://www.cnblogs.com/lcw/p/3762927.html [VI使用] 1.在命令行模式 :在vi编辑器中将光标放在函数上,shift + k 可直接man手册 ...
- 你竟然在公钥中下毒!——如何在RSA公钥中添加后门
原文:http://www.hackdig.com/?01/hack-17893.htm 分享到: 当我知道它是如何运行时,我惊得下巴都掉了.这是一个非常简单的手法,但这篇文章会颠覆你之前对RSA的看 ...
- 产看Linux运行时间
Linux下如何查看系统启动时间和运行时间 1.uptime命令输出:16:11:40 up 59 days, 4:21, 2 users, load average: 0.00, 0.01, 0.0 ...
- 关闭linux退格键和vi发出的嘟嘟声
以root用户登录,然后请安下面方法进行操作: 在命令行下执行:echo "rmmod pcspkr" >> /etc/rc.d/rc.local
- Docker容器跨主机通信之:直接路由方式
一.Docker网络基本原理 直观上看,要实现网络通信,机器需要至少一个网络接口(物理接口或虚拟接口)与外界相通,并可以收发数据包:此外,如果不同子网之间要进行通信,需要额外的路由机制. Docker ...
- MST最小生成树
首先,贴上一个很好的讲解贴: http://www.wutianqi.com/?p=3012 HDOJ 1233 还是畅通工程 http://acm.hdu.edu.cn/showproblem.ph ...
- 第六届CCF软件能力认证
1.数位之和 问题描述 给定一个十进制整数n,输出n的各位数字之和. 输入格式 输入一个整数n. 输出格式 输出一个整数,表示答案. 样例输入 20151220 样例输出 13 样例说明 201512 ...
- Storm(一)Storm的简介与相关概念
一.Storm的简介 官网地址:http://storm.apache.org/ Storm是一个免费开源.分布式.高容错的实时计算系统.Storm令持续不断的流计算变得容易,弥补了Hadoop批处理 ...