最小割

套路最小割。。。

盗一波图 来自GXZ神犇

对于这样的图,我们要么割ai,bj,要么割bi,aj,要么割ai,ci+cj,aj,要么割bi,ci+cj,bj,然后这样建图跑最小割就行了

但这不是重点,这道题我t了大概一个月,不知道为什么,怎么和别人比对代码好像没有什么差异,结果发现判断delta=0不能放在for循环里,否则会很慢。。。俞勇的红书不靠谱啊。。。怪不得我的网络流那么慢。。。

#include<bits/stdc++.h>
using namespace std;
const int N = , inf = ;
const int dx[] = {-, , , }, dy[] = {, , -, };
int head[N], d[N], q[N], iter[N];
struct edge {
int nxt, to, f;
} e[N * ];
int n, cnt = , source, sink, ans, m;
#define id(i, j) (i - 1) * m + j
int read()
{
int x = , f = ; char c = getchar();
while(c < '' || c > '') { if(c == '-') f = -; c = getchar(); }
while(c >= '' && c <= '') { x = x * + c - ''; c = getchar(); }
return x * f;
}
void link(int u, int v, int f)
{
e[++cnt].nxt = head[u];
head[u] = cnt;
e[cnt].to = v;
e[cnt].f = f;
}
void insert(int u, int v, int f)
{
link(u, v, f);
link(v, u, );
}
bool bfs()
{
queue<int> q;
q.push(source);
memset(d, , sizeof(d));
d[source] = ;
while(!q.empty())
{
int u = q.front();
q.pop();
for(int i = head[u]; i; i = e[i].nxt) if(e[i].f && !d[e[i].to])
{
d[e[i].to] = d[u] + ;
q.push(e[i].to);
if(e[i].to == sink) return true;
}
}
return false;
}
int dfs(int u, int delta)
{
if(u == sink || delta == ) return delta;
int ret = ;
for(int &i = iter[u]; i; i = e[i].nxt) if(e[i].f && d[e[i].to] == d[u] + )
{
int x = dfs(e[i].to, min(e[i].f, delta));
if(x == ) d[e[i].to] = ;
e[i].f -= x;
e[i ^ ].f += x;
delta -= x;
ret += x;
if(delta == ) return ret;
}
return ret;
}
int dinic()
{
int ret = ;
while(bfs())
{
for(int i = source; i <= sink; ++i) iter[i] = head[i];
ret += dfs(source, inf);
}
return ret;
}
int main()
{
scanf("%d%d", &n, &m);
sink = n * m + ;
for(int i = ; i <= n; ++i)
for(int j = ; j <= m; ++j)
{
int x, a = id(i, j);
scanf("%d", &x);
ans += x;
if((i + j) & ) insert(source, a, x);
else insert(a, sink, x);
}
for(int i = ; i <= n; ++i)
for(int j = ; j <= m; ++j)
{
int x, a = id(i, j);
scanf("%d", &x);
ans += x;
if((i + j) & ) insert(a, sink, x);
else insert(source, a, x);
}
for(int i = ; i <= n; ++i)
for(int j = ; j <= m; ++j)
{
int x, a = id(i, j), b;
scanf("%d", &x);
for(int k = ; k < ; ++k)
{
int xx = i + dx[k], yy = j + dy[k];
b = id(xx, yy);
if(xx > && xx <= n && yy > && yy <= m)
{
ans += x;
insert(a, b, x);
insert(b, a, x);
}
}
}
printf("%d\n", ans - dinic());
return ;
}

bzoj2132的更多相关文章

  1. 一类最小割bzoj2127,bzoj2132 bzoj3438

    思考一下我们接触的最小割问题 最小割的基本问题(可能会和图论的知识相结合,比如bzoj1266,bzoj1797) 最大权闭合图(bzoj1497) 最大点权覆盖集,最大点权独立集(bzoj1324) ...

  2. 【BZOJ2132】圈地计划(最小割)

    [BZOJ2132]圈地计划(最小割) 题面 BZOJ 题解 对我而言,不可做!!! 所以我膜烂了ZSY大佬 他的博客写了怎么做... 这,,...太强啦!! 完全想不到黑白染色之后反着连边 然后强行 ...

  3. 【BZOJ2132】圈地计划 最小割

    [BZOJ2132]圈地计划 Description 最近房地产商GDOI(Group of Dumbbells Or Idiots)从NOI(Nuts Old Idiots)手中得到了一块开发土地. ...

  4. bzoj2132圈地计划

    bzoj2132圈地计划 题意: 一块土地可以纵横划分为N×M块小区域.于第i行第j列的区域,建造商业区将得到Aij收益,建造工业区将得到Bij收益.而如果区域(i,j)相邻(相邻是指两个格子有公共边 ...

  5. bzoj2132: 圈地计划

    要分成两坨对吧.. 所以显然最小割 但是不兹辞啊.. 最小割是最小的啊 求最大费用怎么玩啊 那咱们就把所有费用都加起来,减掉一个最小的呗 但是两个属于不同集合的点贡献的价值是负的啊 网络流怎么跑负的啊 ...

  6. bzoj2132: 圈地计划(最小割)

    传送门 看来以后见到矩形就要黑白染色冷静一下了…… 首先,如果它的要求时候相邻的选择相同,那么就是和这一题一样了->这里 然后考虑不同的要怎么做 那就把矩形黑白染色一下吧 然后令其中一种颜色的A ...

  7. 【bzoj2132】圈地计划 网络流最小割

    题目描述 最近房地产商GDOI(Group of Dumbbells Or Idiots)从NOI(Nuts Old Idiots)手中得到了一块开发土地.据了解,这块土地是一块矩形的区域,可以纵横划 ...

  8. BZOJ2132 圈地计划 【最小割】

    题目 最近房地产商GDOI(Group of Dumbbells Or Idiots)从NOI(Nuts Old Idiots)手中得到了一块开发土地.据了解, 这块土地是一块矩形的区域,可以纵横划分 ...

  9. bzoj2132【圈地计划】

    题面 思路: 一开始以为和为了博多一样,两边连一样的,后来发现中间连负边的话根本不会割,即割断两块收益为负,所以WA的起飞…… 正解是先黑白染色,每个点和它周围的点连边方式不同.对于黑点A,S--&g ...

随机推荐

  1. YOLOv3配置(win10+opencv3.40+cuda9.1+cudnn7.1+vs2015)

    最近心血来潮想学一下YOLOv3,于是就去网上看了YOLOv3在win10下的配置教程.在配置过程中塌坑无数,花了很多时间和精力,所以我想就此写一篇博客来介绍在在win10+vs2015的环境下如何配 ...

  2. UVa 806 四分树

    题意: 分析: 类似UVa 297, 模拟四分树四分的过程, 就是记录一个左上角, 记录宽度wideth, 然后每次w/2这样递归下去. 注意全黑是输出0, 不是输出1234. #include &l ...

  3. <mongoose>……find与findOne的区别……//

    mongoose中的 find 和 findOne 都是用来查找指定表的数据的 find指的是查找指定表的所有数据,返回的是数组 User.find().then((result)=>{ con ...

  4. Devu and Flowers lucas定理+容斥原理

    Devu wants to decorate his garden with flowers. He has purchased n boxes, where the i-th box contain ...

  5. [bzoj3712][PA2014]Fiolki_倍增LCA

    Fiolki bzoj-3712 PA-2014 题目大意:题目链接. 注释:略. 想法: 神题! 我们建树:对于一次倾倒操作,我们弄一个新的大瓶子作为两个合并瓶子的父亲节点,与两个瓶子相连. 对于一 ...

  6. POJ2586 Y2K Accounting Bug 解题报告

    Description Accounting for Computer Machinists (ACM) has sufferred from the Y2K bug and lost some vi ...

  7. Mysql五大引擎之间的区别和优劣之分

    数据库引擎介绍 MySQL数据库引擎取决于MySQL在安装的时候是如何被编译的.要添加一个新的引擎,就必须重新编译MYSQL.在缺省情况下,MYSQL支持三个引擎:ISAM.MYISAM和HEAP.另 ...

  8. java设计模式——单例设计模式

    /*设计模式:对问题行之有效的解决方式.其实它是一种思想. 1,单例设计模式.    解决的问题:就是可以保证一个类在内存中的对象唯一性. 必须对于多个程序使用同一个配置信息对象时,就需要保证该对象的 ...

  9. 选择判断语句(switch)

    选择判断语句(switch) 一.switch语句格式 switch(表达式){ case 取值1: 执行语句: break: case 取值2: 执行语句: break: …...    defau ...

  10. html5 虚拟键盘弹出挡住底部的输入框解决方案

    问题描述: 我们使用 h5 做移动网站开发时,如果文本框在页面的下方,当输入信息弹出的软键盘会将输入框挡住(Android 会有这个问题,IOS会自动将整个页面上移),IOS中软键盘关闭后,页面上移的 ...