[GDKOI2010] 圈地计划(网络流)
题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] 圈地计划(网络流)的更多相关文章
- 【bzoj2132】圈地计划 网络流最小割
题目描述 最近房地产商GDOI(Group of Dumbbells Or Idiots)从NOI(Nuts Old Idiots)手中得到了一块开发土地.据了解,这块土地是一块矩形的区域,可以纵横划 ...
- 洛谷$P1935$ [国家集训队]圈地计划 网络流
正解:最小割 解题报告: 传送门 就文理分科模型嘛$QwQ$?所以就,跑个最小割呗,然后就做完辣?仔细想想细节发现并麻油那么简单嗷$QwQ$ 先考虑如果没有这个$k\cdot C_{i,j}$的贡献就 ...
- 【BZOJ】【2132】圈地计划
网络流/最小割 Orz Hzwer 这类大概是最小割建模中的经典应用吧…… 黑白染色,然后反转黑色的技巧感觉很巧妙!这个转化太神奇了…… /****************************** ...
- [BZOJ]2132: 圈地计划 最小割
圈地计划 Description 最近房地产商GDOI(Group of Dumbbells Or Idiots)从NOI(Nuts Old Idiots)手中得到了一块开发土地.据了解,这块土地是一 ...
- 【BZOJ2132】圈地计划(最小割)
[BZOJ2132]圈地计划(最小割) 题面 BZOJ 题解 对我而言,不可做!!! 所以我膜烂了ZSY大佬 他的博客写了怎么做... 这,,...太强啦!! 完全想不到黑白染色之后反着连边 然后强行 ...
- 【BZOJ2132】圈地计划 最小割
[BZOJ2132]圈地计划 Description 最近房地产商GDOI(Group of Dumbbells Or Idiots)从NOI(Nuts Old Idiots)手中得到了一块开发土地. ...
- bzoj2132: 圈地计划(无比强大的最小割)
2132: 圈地计划 题目:传送门 简要题意: 给出一个矩阵,一共n*m个点,并给出三个收益矩阵.A矩阵表示这个点建A的可取收益,B矩阵表示这个点建B的可取收益,C矩阵表示如果相邻(有且仅有一条公共边 ...
- bzoj2132圈地计划
bzoj2132圈地计划 题意: 一块土地可以纵横划分为N×M块小区域.于第i行第j列的区域,建造商业区将得到Aij收益,建造工业区将得到Bij收益.而如果区域(i,j)相邻(相邻是指两个格子有公共边 ...
- $BZOJ3232$ 圈地游戏 网络流
正解:最小割+01分数规划 解题报告: 传送门$QwQ$ 感$jio$这个好像是$NOIp2018$集训的时候$cjk$学长讲01分数规划的时候港的,,,?$QwQ$虽然我还是不会嘤 首先看到这个分数 ...
随机推荐
- UVa 12716 GCD XOR (简单证明)
题意: 问 gcd(i,j) = i ^ j 的对数(j <=i <= N ) N的范围为30000000,有10000组例子 思路:GCD(a,b) = a^b = c GCD(a/c ...
- postMan模拟get和post请求,支持局域网和外网
chrome应用postMan,可以安装一下,非常方便. 可以FQ下载安装. post参数要在body中设置 get参数直接在url中
- tf.placeholder类似函数中的形参
tf.placeholder(dtype, shape=None, name=None) 此函数可以理解为形参,用于定义过程,在执行的时候再赋具体的值 参数: dtype:数据类型.常用的是tf.fl ...
- 手动配置IP网络
1. #vi /etc/sysconfig/network-scripts/ifcfg-ens33 ifcfg-ens33 是网卡的名字,根据自己的计算机 2. 修改配置 ONBOOT=no改为ONB ...
- C#调用Exe程序示例
在编写程序时经常会使用到调用可执行程序的情况,本文将简单介绍C#调用exe的方法.在C#中,通过Process类来进行进程操作. Process类在System.Diagnostics包中. 示例一 ...
- 51nod 1402 最大值 3级算法题 排序后修改限制点 时间复杂度O(m^2)
代码: 题意,第一个数为0,相邻的数相差0或者1,有一些点有限制,不大于给定值,求这组数中可能的最大的那个数. 这题我们看一个例子:第5个数的限制为2 1 2 3 4 5 6 7 8 9 0 1 2 ...
- css3实现轮播图
css3动画属性简写: animation: name duration timing-function delay iteration-count direction fill-mode ...
- SpringCloud学习笔记(20)----Spring Cloud Netflix之服务网关Zuul的各种姿势
1. 禁用过滤器 # zuul.<SimpleClassName>.<filterType>.disable=true # 例如禁用 自定义的过滤器 zuul.MyFilter ...
- 3ds Max修改桌面快捷方式为中文语言
通过上篇教程的学习,我们已经会切换3ds Max 2018的界面语言了,相关内容可参阅3ds Max如何设置中文界面.但是如果每次都要从开始菜单进行操作,岂不麻烦?简单一点,可以在桌面添加3ds Ma ...
- Mojo C++ Bindings API
This document is a subset of the Mojo documentation. Contents Overview Getting Started Interfaces Ba ...