题面

思路:

一开始以为和为了博多一样,两边连一样的,后来发现中间连负边的话根本不会割,即割断两块收益为负,所以WA的起飞……

正解是先黑白染色,每个点和它周围的点连边方式不同。对于黑点A,S-->A表示商业区的价值,A-->T表示工业区的价值,白点相反,对于相邻的情况,边权表示相邻的价值和,这样割断相当于选择同一用途,代价为正。

 #include <map>
#include <set>
#include <cmath>
#include <queue>
#include <stack>
#include <cstdio>
#include <string>
#include <vector>
#include <cstring>
#include <complex>
#include <cstdlib>
#include <iostream>
#include <algorithm>
#define rg register
#define ll long long
using namespace std; inline int gi()
{
rg int r = ; rg bool b = ; rg char c = getchar();
while ((c < '' || c > '') && c != '-') c = getchar();
if (c == '-') b = ;
while (c >= '' && c <= '') { r = (r << ) + (r << ) + c - '', c = getchar(); }
if (b) return r; return -r;
} const int inf = 2e8+, N = , M = 5e5+;
int n,m,num,S,T;
int dx[]={,,-,},dy[]={-,,,},dep[N*N],f[N*N],c[N][N];
bool col[N][N];
queue <int> q;
struct Edge
{
int to,nx,cap;
}eg[M]; inline void add(int x,int y,int z)
{
eg[++num]=(Edge){y,f[x],z}, f[x]=num;
} inline void link(int x,int y,int z)
{
add(x,y,z), add(y,x,);
} inline int dfs(int o,int flow)
{
if (o == T || !flow) return flow;
rg int to,cap,fl,tmp,i;
fl=;
for (i=f[o]; i; i=eg[i].nx)
{
to=eg[i].to, cap=eg[i].cap;
if (dep[o] != dep[to]- || cap <= )
continue;
tmp=dfs(to,min(flow,cap));
if (!tmp) continue;
fl+=tmp, flow-=tmp;
eg[i].cap-=tmp, eg[i^].cap+=tmp;
if (!flow) break;
}
if (!fl) dep[o]=;
return fl;
} inline int bfs()
{
memset(dep,,sizeof(dep));
rg int o,to,cap,i;
q.push(S); dep[S]=;
while (!q.empty())
{
o=q.front(), q.pop();
for (i=f[o]; i; i=eg[i].nx)
{
to=eg[i].to, cap=eg[i].cap;
if (dep[to] || cap <= )
continue;
dep[to]=dep[o]+, q.push(to);
}
}
return dep[T];
} inline int dinic()
{
rg int flow;
flow=;
while (bfs()) flow+=dfs(S,inf);
return flow;
} int main()
{
rg int i,j,k,x,y,dis,ans;
n=gi(), m=gi();
ans=S=, T=n*m+, num=;
for (i=; i<=n; ++i)
for (j=; j<=m; ++j)
if ((i+j)&)
col[i][j]=;
for (i=; i<=n; ++i)
for (j=; j<=m; ++j)
{
dis=gi(), ans+=dis;
if (col[i][j])
link(S,(i-)*m+j,dis);
else
link((i-)*m+j,T,dis);
} for (i=; i<=n; ++i)
for (j=; j<=m; ++j)
{
dis=gi(), ans+=dis;
if (col[i][j])
link((i-)*m+j,T,dis);
else
link(S,(i-)*m+j,dis);
}
for (i=; i<=n; ++i) for (j=; j<=m; ++j) c[i][j]=gi();
for (i=; i<=n;++i)
for (j=; j<=m; ++j)
{
if (!col[i][j]) continue;
for (k=; k<; ++k)
{
x=i+dx[k], y=j+dy[k];
if (x > n || x < || y > m || y < )
continue;
add((i-)*m+j,(x-)*m+y,c[i][j]+c[x][y]);
add((x-)*m+y,(i-)*m+j,c[i][j]+c[x][y]);
ans+=c[i][j]+c[x][y];
}
}
printf("%d\n",ans-dinic());
return ;
}

bzoj2132【圈地计划】的更多相关文章

  1. bzoj2132圈地计划

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

  2. bzoj2132: 圈地计划(无比强大的最小割)

    2132: 圈地计划 题目:传送门 简要题意: 给出一个矩阵,一共n*m个点,并给出三个收益矩阵.A矩阵表示这个点建A的可取收益,B矩阵表示这个点建B的可取收益,C矩阵表示如果相邻(有且仅有一条公共边 ...

  3. bzoj2132: 圈地计划

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

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

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

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

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

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

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

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

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

  8. 【BZOJ】【2132】圈地计划

    网络流/最小割 Orz Hzwer 这类大概是最小割建模中的经典应用吧…… 黑白染色,然后反转黑色的技巧感觉很巧妙!这个转化太神奇了…… /****************************** ...

  9. [BZOJ]2132: 圈地计划 最小割

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

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

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

随机推荐

  1. 官方Java编码规范

    先由Sun制定,之后Sun把Java卖给了Oracle,最后就成了Oracle制定的了.但是版本比较旧了,停留在1999年. 相比Google的编码规范,罪名写的却别就是Sun采用的是4个空格进行缩进 ...

  2. 【spring data jpa】使用spring data jpa时,关于service层一个方法中进行【删除】和【插入】两种操作在同一个事务内处理

    场景: 现在有这么一个情况,就是在service中提供的一个方法是先将符合条件的数据全部删除,然后再将新的条件全部插入数据库中 这个场景需要保证service中执行两步 1.删除 2.插入 这两步自然 ...

  3. tensorflow搭建神经网络基本流程

    定义添加神经层的函数 1.训练的数据2.定义节点准备接收数据3.定义神经层:隐藏层和预测层4.定义 loss 表达式5.选择 optimizer 使 loss 达到最小 然后对所有变量进行初始化,通过 ...

  4. The bean 'xxx' could not be injected as a 'xxx'because it is a JDK dynamic proxy that implements

    启动springboot项目的时候示以下错误 Error starting ApplicationContext. To display the conditions report re-run yo ...

  5. discuz X3.1+Apache2.2+php-5.2.17+mysql5.6.14+Discuz_X3.1

    discuz X3.1+Apache2.2.25+php-5.2.17+mysql5.6.14+Discuz_X3.1 一.准备 1.httpd-2.2.25-win32-x86-no_ssl.msi ...

  6. HDU 3435A new Graph Game(网络流之最小费用流)

    题目地址:HDU 3435 这题刚上来一看,感觉毫无头绪. .再细致想想.. 发现跟我做的前两道费用流的题是差点儿相同的. 能够往那上面转换. 建图基本差点儿相同.仅仅只是这里是无向图.建图依旧是拆点 ...

  7. Sencha Touch 之初接触

    1.Sencha Touch开发与普通web开发有什么区别? Sencha Touch(为方便起见,本文后面一律简写为ST)页面的开发跟普通html页面相比,总体来说没有本质上的区别,只是引入了对ht ...

  8. [Maven实战](9)传递性依赖

    了解Spring的朋友都知道.创建一个Spring Framework项目都须要依赖什么样的Jar包.假设不使用Maven,那么在项目中就须要手动下载相关的依赖.因为Spring Framework又 ...

  9. Fighting regressions with git bisect---within git bisect algorithm

    https://www.kernel.org/pub/software/scm/git/docs/git-bisect-lk2009.html Fighting regressions with gi ...

  10. openwrt 修改 banner

    http://www.network-science.de/ascii/ rectangles 风格