对于网格图,尤其是这种要求相邻各自不同的,考虑黑白染色

对于这张染色后图来说:



对于每个黑格:

  • 表示初始时选择商业区;
  • s点向它连商业区收益的流量,它向t点连工业区收益的流量;
  • 割断S侧的边说明反悔,则保留T侧边的边权(工业区),割断T侧的边说明维持原样,保留S侧边权(商业区)

对于每个白格:

  • 表示初始时选择工业区;
  • s点向它连工业区收益的流量,它向t点连商业区收益的流量;
  • 割断S侧的边说明反悔,则保留T侧边的边权(商业区),割断T侧的边说明维持原样,保留S侧边权(工业区)

对于相邻格子:

  • 相邻黑白格子间连区域不同收益的流量,双向边(注意是这两个格子的c值和)
  • 如果相邻两个点被划入同侧,则它们中间的边不会被割,收益被保留;如果被划入异侧,则中间边被割断,收益被减掉

\(ans = sum- 最小割\) (注意这里的sum是对于每个周边有k个格子的格子(i,j),算上c[i][j]*k)

建图:

#include<iostream>
#include<cstdio>
#include<queue>
#include<cstring>
using namespace std;
const int N=105,E=1000005,inf=1e9,dx[]={1,-1,0,0},dy[]={0,0,-1,1};
int n,m,a[N][N],b[N][N],c[N][N],id[N][N],s,t,sum,h[E],cnt=1,le[E];
struct qwe
{
int ne,to,va;
}e[E<<1];
int read()
{
int r=0,f=1;
char p=getchar();
while(p>'9'||p<'0')
{
if(p=='-')
f=-1;
p=getchar();
}
while(p>='0'&&p<='9')
{
r=r*10+p-48;
p=getchar();
}
return r*f;
}
void add(int u,int v,int w)
{
cnt++;
e[cnt].ne=h[u];
e[cnt].to=v;
e[cnt].va=w;
h[u]=cnt;
}
void ins(int u,int v,int w)
{
add(u,v,w);
add(v,u,0);
}
bool bfs()
{
queue<int>q;
memset(le,0,sizeof(le));
le[s]=1;
q.push(s);
while(!q.empty())
{
int u=q.front();
q.pop();
for(int i=h[u];i;i=e[i].ne)
if(!le[e[i].to]&&e[i].va>0)
{
le[e[i].to]=le[u]+1;
q.push(e[i].to);
}
}
return le[t];
}
int dfs(int u,int f)
{
if(u==t||!f)
return f;
int us=0;
for(int i=h[u];i&&us<f;i=e[i].ne)
if(le[u]+1==le[e[i].to]&&e[i].va>0)
{
int t=dfs(e[i].to,min(e[i].va,f-us));
e[i].va-=t;
e[i^1].va+=t;
us+=t;
}
if(!us)
le[u]=0;
return us;
}
int dinic()
{
int re=0;
while(bfs())
re+=dfs(s,inf);
return re;
}
int main()
{
n=read(),m=read();
t=n*m+1;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
a[i][j]=read(),sum+=a[i][j];
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
b[i][j]=read(),sum+=b[i][j];
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
{
c[i][j]=read();
int t=0;
for(int k=0;k<4;k++)
if(i+dx[k]>=1&&i+dx[k]<=n&&j+dy[k]>=1&&j+dy[k]<=m)
t++;
sum+=c[i][j]*t;
}
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
id[i][j]=(i-1)*m+j;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
{
if((i+j)%2==1)
{
ins(s,id[i][j],a[i][j]);
ins(id[i][j],t,b[i][j]);
}
else
{
ins(s,id[i][j],b[i][j]);
ins(id[i][j],t,a[i][j]);
}
// for(int k=0;k<4;k++)
// if(i+dx[k]>=1&&i+dx[k]<=n&&j+dy[k]>=1&&j+dy[k]<=m)
// ins(id[i][j],id[i+dx[k]][j+dy[k]],c[i][j]+c[i+dx[k]][j+dy[k]]);
if(i!=n)
{
add(id[i][j],id[i+1][j],c[i][j]+c[i+1][j]);
add(id[i+1][j],id[i][j],c[i][j]+c[i+1][j]);
}
if(j!=m)
{
add(id[i][j],id[i][j+1],c[i][j]+c[i][j+1]);
add(id[i][j+1],id[i][j],c[i][j]+c[i][j+1]);
}
}
printf("%d\n",sum-dinic());
return 0;
}

bzoj 2132 圈地计划【最小割+dinic】的更多相关文章

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

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

  2. BZOJ 2131 圈地计划(最小割+黑白染色)

    类似于happiness的一道题,容易想到最小割的做法. 但是不同的是那一道题是相邻的如果相同则有收益,这题是相邻的不同才有收益. 转化到建图上面时,会发现,两个相邻的点连的边容量会是负数.. 有一种 ...

  3. BZOJ 2132 圈地计划(最小割)

    题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=2132 题意:n*m的格子染色黑白,对于格子(i,j)染黑色则价值为A[i][j],白色为 ...

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

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

  5. bzoj 3144 [Hnoi2013]切糕【最小割+dinic】

    都说了是'切'糕所以是最小割咯 建图: 每个点向下一层连容量为这个点的val的边,S向第一层连容量为inf的边,最后一层向T连容量为自身val的边,即割断这条边相当于\( f(i,j) \)选择了当前 ...

  6. bzoj 2132 圈地计划(黑白染色,最小割)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=2132 [题意] 给定n*m个区域,建工业区价值A,建商业区价值B,如果(i,j)有k个 ...

  7. bzoj 3894 文理分科【最小割+dinic】

    谁说这道和2127是双倍经验的来着完全不一样啊? 数组开小会TLE!数组开小会TLE!数组开小会TLE! 首先sum统计所有收益 对于当前点\( (i,j) \)考虑,设\( x=(i-1)*m+j ...

  8. bzoj 2132: 圈地计划

    #include<cstdio> #include<iostream> #include<cstring> #define M 100009 #define inf ...

  9. bzoj 2127 happiness【最小割+dinic】

    参考:https://www.cnblogs.com/chenyushuo/p/5144957.html 不得不说这个建图方法真是非常妙啊 假设S点选理,T点选文,a[i][j]为(i,j)选文收益, ...

随机推荐

  1. HUNAN 11567 Escaping (最大流)

    http://acm.hunnu.edu.cn/online/?action=problem&type=list&courseid=0&querytext=&pagen ...

  2. 实时更新数据的jQuery图表插件DEMO演示

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  3. MySQL错误日志、binlog日志、查询日志、慢查询日志简介

    1.数据库的日志是帮助数据库管理员,追踪分析数据库曾经发生的各种事件的有力依据,mysql中提供了错误日志.binlog日志(二进制日志).查处日志.慢查询日志.在此,我力求解决以下问题:各个日志的作 ...

  4. dubbo-admin安装和使用

    更新下链接,不知道是不是这个项目合入Apache的缘故,链接都变成了https://github.com/apache/incubator-dubbo/ 按照常理,直接去 https://github ...

  5. IOS开发 APP提交程序上传流程

    由于苹果的机制,在非越狱机器上安装应用必须通过官方的App Store,开发者开发好应用后上传App Store,也需要通过审核等环节.AppCan作为一个跨主流平台的一个开发平台,也对ipa包上传A ...

  6. Django学习系列之request对象

    先来一个简单的实例 urls.py from django.conf.urls import url from django.contrib import admin from cmdb import ...

  7. Office Adobe Acrobat把PDF转换为Word时候提示不支持的Type2字体怎么办

    如下图所示,在使用Adobe Acrobat Pro9将PDF转换为Word的时候出现下面的错误   很简单,不要用Adobe Acrobat Pro9了,用Adobe Acrobat Pro X,还 ...

  8. Office EXCEL 如何保留两位小数,四舍五入

    选中若干单元格,然后右击设置单元格格式,数值中保留两位小数   使用round函数四舍五入,如下图所示,我在N10单元格中输入"ROUND(M10,1)"即可,其中ROUND是函数 ...

  9. linux core文件设置

     http://blog.csdn.net/ctthuangcheng/article/details/8963551 linux core文件设置 分类: Linux OS Debugging Te ...

  10. 深度学习笔记之关于总结、展望、参考文献和Deep Learning学习资源(五)

    不多说,直接上干货! 十.总结与展望 1)Deep learning总结 深度学习是关于自动学习要建模的数据的潜在(隐含)分布的多层(复杂)表达的算法.换句话来说,深度学习算法自动的提取分类需要的低层 ...