题2链接:https://www.luogu.org/problemnew/show/P1935

Description

最近房地产商GDOI(Group of Dumbbells Or Idiots)从NOI(Nuts Old Idiots)手中得到了一块开发土地。据了解,这块土地是一块矩形的区域,可以纵横划分为N×M块小区域。GDOI要求将这些区域分为商业区和工业区来开发。根据不同的地形环境,每块小区域建造商业区和工业区能取得不同的经济价值。更具体点,对于第i行第j列的区域,建造商业区将得到Aij收益,建造工业区将得到Bij收益。

题1 
另外同种的区域连在一起可以得到额外的收益,即如果相邻有K块(显然K不超过4)同种类型的区域,则这块区域能增加k×Cij收益。

上面注意是相同的区域可获得收益,而下面的是不同的区域可获得收益

题2 
另外不同的区域连在一起可以得到额外的收益,即如果区域(I,j)相邻(相邻是指两个格子有公共边)有K块(显然K不超过4)类型不同于(I,j)的区域,则这块区域能增加k×Cij收益。

经过Tiger.S教授的勘察,收益矩阵A,B,C都已经知道了。你能帮GDOI求出一个收益最大的方案么?

我们首先看T1

仔细看题,对于每一块区域我们要选择它是商业区还是工业区。嗯?分成两个?在考虑若是所有的c数组不论该点选怎么都能产生贡献,我们最后减去最小的多算的贡献就好了。

注意这所谓最小的贡献必须建立在每一块区域都被明确的选择了类型上

于是乎,很容易就可以想到求最小的贡献就是直接最小割了

那么如何建图?

(相同的有额外收益) 则源点向所有点连商业区的收益,所有点向汇点连工业区的收益,相邻的点连双向边额外的收益 

答案就是总收益减去最小割

T1就是这样

#include<bits/stdc++.h>
using namespace std; const int inf=1e9+;
const int maxn=+;
int n,m,tot=-,s,t;
int head[maxn*maxn],c[maxn][maxn],chead[maxn*maxn],vis[maxn*maxn];
int l[]={,},r[]={,};
struct EDGE
{
int to,next,cap;
}edge[maxn<<];
inline int read()
{
char ch=getchar();
int s=,f=;
while (!(ch>=''&&ch<='')) {if (ch=='-') f=-;ch=getchar();}
while (ch>=''&&ch<='') {s=(s<<)+(s<<)+ch-'';ch=getchar();}
return s*f;
}
int get(int x,int y)
{
return (x-)*m+y;
}
void add(int x,int y,int z1,int z2)
{
edge[++tot]=(EDGE){y,head[x],z1};
head[x]=tot;
edge[++tot]=(EDGE){x,head[y],z2};
head[y]=tot;
}
bool bfs()
{
memset(vis,,sizeof(vis));
queue <int> q;
vis[s]=;
q.push(s);
while (!q.empty())
{
int k=q.front();q.pop();
for (int i=head[k];i!=-;i=edge[i].next)
{
int y=edge[i].to;
if (!vis[y]&&edge[i].cap)
{
vis[y]=vis[k]+;
q.push(y);
}
}
}
return vis[t]!=;
}
int dfs(int x,int flow)
{
if (x==t||!flow) return flow;
int f,a=;
for (int &i=chead[x];i!=-;i=edge[i].next)
{
int y=edge[i].to;
if (vis[y]==vis[x]+&&(f=dfs(y,min(edge[i].cap,flow)))>)
{
edge[i].cap-=f;
edge[i^].cap+=f;
a+=f;
flow-=f;
if (flow==) break;
}
}
if (a==) vis[x]=-;
return a;
}
int dinic()
{
int ans=;
while (bfs())
{
for (int i=;i<=n*m+;i++) chead[i]=head[i];
ans+=dfs(s,inf);
}
return ans;
}
int main()
{
int ans=;
n=read();m=read();
s=;t=n*m+;
memset(head,-,sizeof(head));
for (int i=;i<=n;i++)
for (int j=;j<=m;j++)
{
int x=read();
add(s,get(i,j),x,);
ans+=x;
}
for (int i=;i<=n;i++)
for (int j=;j<=m;j++)
{
int x=read();
add(get(i,j),t,x,);
ans+=x;
}
for (int i=;i<=n;i++)
for (int j=;j<=m;j++)
c[i][j]=read();
for (int i=;i<=n;i++)
for (int j=;j<=m;j++)
for (int k=;k<=;k++)
{
int x1=i+l[k],y1=j+r[k];
if (x1<=||x1>n||y1<=||y1>m) continue;
add(get(i,j),get(x1,y1),c[i][j]+c[x1][y1],c[i][j]+c[x1][y1]);
ans+=(c[i][j]+c[x1][y1]);
}
printf("%d",ans-dinic());
return ;
}

[GDKOI2010] 圈地计划(网络流)的更多相关文章

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

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

  2. 洛谷$P1935$ [国家集训队]圈地计划 网络流

    正解:最小割 解题报告: 传送门 就文理分科模型嘛$QwQ$?所以就,跑个最小割呗,然后就做完辣?仔细想想细节发现并麻油那么简单嗷$QwQ$ 先考虑如果没有这个$k\cdot C_{i,j}$的贡献就 ...

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

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

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

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

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

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

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

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

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

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

  8. bzoj2132圈地计划

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

  9. $BZOJ3232$ 圈地游戏 网络流

    正解:最小割+01分数规划 解题报告: 传送门$QwQ$ 感$jio$这个好像是$NOIp2018$集训的时候$cjk$学长讲01分数规划的时候港的,,,?$QwQ$虽然我还是不会嘤 首先看到这个分数 ...

随机推荐

  1. VC6.0VB6.0 Scratch等软件

    VC6.0VB6.0 Scratch等软件 http://pan.baidu.com/s/1nv4hJrb

  2. C++实现页码数字统计

    #include<iostream> #include<iomanip> #include<cstdlib> #include<ctime> #incl ...

  3. 图片3d轮放查看效果

    本功能比較简单,就是一个大幕.左右滚动播放图片. 关键点在于怎样实现平滑的滚动,包含动画效果,3d效果等. <style> img { position: absolute; top:20 ...

  4. Android,iOS打开手机QQ与指定用户聊天界面

    在浏览器中能够通过JS代码打开QQ并弹出聊天界面.一般作为客服QQ使用. 而在移动端腾讯貌似没有发布提供相似API,可是却能够使用schema模式来启动手机QQ. 下面为详细代码: Android: ...

  5. AJAX入门---点滴的积累

    AJAX入门---点滴的积累 每次学习完一个内容总会写上几句话总结一下学习的内容.这不刚看完王兴魁老师讲的AJAX核心技术.如今回想梳理一下. 这套视频的内容不多,简单的解说了XMLHttpReque ...

  6. 你不知道的JavaScript(四)数值

    JS中只有一种数值类型,即number.不管是整数还是小数都属于number类型,事实上JS并不区分小数和整数. <div> <script type="text/java ...

  7. java中三个类别加载器的关系以及各自加载的类的范围

    Java在需要使用类别的时候,才会将类别加载,Java的类别载入是由类别载入器(Class loader)来达到的,预设上,在程序启动之后,主要会有三个类别加载器:Bootstrap Loader.E ...

  8. c# 02-18 值类型 引用类型 字符串的不可变性 字符串的处理方法

    1值类型 直接把值存在栈中 栈的特点是后进先出 int double decimal char struct enum bool 2 引用类型 把值存在堆中,把地址存在栈中: string 自定义的类 ...

  9. (转载)比较web ui 框架

    以下是几个精致的web UI框架 1.Aliceui Aliceui是支付宝的样式解决方案,是一套精选的基于 spm 生态圈的样式模块集合,是 Arale 的子集,也是一套模块化的样式命名和组织规范, ...

  10. 纯净版linux (debian)挂载VirtualBox共享文件夹

    使用的虚拟机版本是:VirtualBox-5.2.8-121009 使用的linux版本是:Linux debian 4.9.0-7-amd64 tty 1. 开始配置 1.1:打开虚拟机设置,打开你 ...