两种版本的题面

Description

最近房地产商GDOI(Group of Dumbbells Or Idiots)从NOI(Nuts Old Idiots)手中得到了一块开发土地。据了解,这块土地是一块矩形的区域,可以纵横划分为N×M块小区域。GDOI要求将这些区域分为商业区和工业区来开发。根据不同的地形环境,每块小区域建造商业区和工业区能取得不同的经济价值。更具体点,对于第i行第j列的区域,建造商业区将得到Aij收益,建造工业区将得到Bij收益。另外不同的区域连在一起可以得到额外的收益,即如果区域(I,j)相邻(相邻是指两个格子有公共边)有K块(显然K不超过4)类型不同于(I,j)的区域,则这块区域能增加k×Cij收益。经过Tiger.S教授的勘察,收益矩阵A,B,C都已经知道了。你能帮GDOI求出一个收益最大的方案么?

Input

输入第一行为两个整数,分别为正整数N和M,分别表示区域的行数和列数;第2到N+1列,每行M个整数,表示商业区收益矩阵A;第N+2到2N+1列,每行M个整数,表示工业区收益矩阵B;第2N+2到3N+1行,每行M个整数,表示相邻额外收益矩阵C。第一行,两个整数,分别是n和m(1≤n,m≤100);

任何数字不超过1000”的限制

Output

输出只有一行,包含一个整数,为最大收益值。

Sample Input

3 3
1 2 3
4 5 6
7 8 9
9 8 7
6 5 4
3 2 1
1 1 1
1 3 1
1 1 1

Sample Output

81
【数据规模】
对于100%的数据有N,M≤100

HINT

数据已加强,并重测--2015.5.15

Source

问题描述
背景:
神犇CJK最近突然意识到他虽然开得多,但是终究没有领会到开的真谛。
比如说每过完一天,回复的精力值经常超过上限,这样产生了很大的浪费。
于是向XLightGod请教,于是发现XlightGod不知道比自己高到哪里去了 。
于是通过与XLightGod的一番谈笑风生,
他在休息的时候也能获得收益,而且还get了一个特技
于是准备改进他的开法,于是他准备制定了一个计划
题目描述:
CJK的计划是一个n*m的矩阵,矩阵的每一个格子代表一天,他每天有两种选择:
开与不开,每种选择都会有不同的收益。当然他还有一个奇奇怪怪的技能:
如果开与不开相间的话,他将获得额外的收益。具体来说,如果格子(i,j)相邻(相邻是指两个
格子有公共边)有K块(显然K不超过4)类型不同于(I,j)的格子,则这个格子能增加k×Cij收益,
你能帮助CJK求出他能获得的最大收益吗?
输入格式
第一行两个整数n,m,表示矩阵的行数与列数。
接下来一个n*m的矩阵,矩阵的第i行第j列表示(i,j)这格子选择开能获得的收益
接下来一个n*m的矩阵,矩阵的第i行第j列表示(i,j)这个格子选择不开能获得的收益
接下来一个n*m的矩阵,矩阵的第i行第j列表示(i,j)这个格子的Cij(见题目描述)
输出格式
输出一行,表示最大收益
样例输入输出

样例输入1
3 3
1 2 3
4 5 6
7 8 9
9 8 7
6 5 4
3 2 1
1 1 1
1 3 1
1 1 1
样例输出1
81
限制与约定
对于30%的数据,n,m<=5
对于100%的数据,n,m<=100
不需要开long long

思路:最小割。

与“为了博多”很像,只不过一个是同样的一个是不同的。

考虑这是个二分图,可以将一些边反过来。。。

对所有点黑白染色,然后对于黑色点b连接(S,b,kai),(b,T,bukai),对于白色点w连接(S,w,bukai)(w,T,bukai),然后对于相邻的点a,b连接(a,b,C[a]+C[b])跑最小割就OK了。。。。

PS.今天终于知道最小割有个优化了。。。一直TLE,还有为了博多1000+ms。。。

本来可以切的。。。

PS2.BZOJ应该过不去,数据水。。。。

 #include<cstdio>
#include<algorithm>
#include<cstring>
#define inf 19260817
using namespace std;
#define rep(a,b,c) for(rg int a=b;a<=c;a++)
#define drep(a,b,c) for(rg int a=b;a>=c;a--)
#define erep(a,b) for(rg int a=fir[b];a;a=nxt[a])
#define il inline
#define rg register
#define vd void
#define t (dis[i])
typedef long long ll;
il int gi(){
rg int x=;rg char ch=getchar();
while(ch<''||ch>'')ch=getchar();
while(ch>=''&&ch<='')x=x*+ch-'',ch=getchar();
return x;
}
const int maxn=,S=,T=,maxm=*;
int id=,fir[maxn],dis[maxm],nxt[maxm],w[maxm];
il vd add(int a,int b,int c){
nxt[++id]=fir[a],fir[a]=id,dis[id]=b,w[id]=c;
if(c)add(b,a,);
}
int num[][],C[][],dep[maxn],head[maxn];
il bool BFS(){
rg int que[maxn],hd=,tl=;
memset(dep,,sizeof dep);
que[hd]=S,dep[S]=;
while(hd-tl){
int now=que[hd++];
erep(i,now)if(!dep[t]&&w[i])que[tl++]=t,dep[t]=dep[now]+;
}
return dep[T];
}
il int Dinic(int now,int maxflow){
if(now==T)return maxflow;
rg int ret=;
for(rg int&i=head[now];i;i=nxt[i])if(w[i]&&dep[t]==dep[now]+){
rg int d=Dinic(t,min(maxflow,w[i]));
w[i]-=d,w[i^]+=d,maxflow-=d,ret+=d;
if(!maxflow)break;
}return ret;
}
int main(){
rg int n=gi(),m=gi(),sum=,a;
rep(i,,n)rep(j,,m)num[i][j]=++num[][];
rep(i,,n)rep(j,,m){
a=gi(),sum+=a;if((i+j)&)add(S,num[i][j],a);else add(num[i][j],T,a);
}
rep(i,,n)rep(j,,m){
a=gi(),sum+=a;if((i+j)&)add(num[i][j],T,a);else add(S,num[i][j],a);
}
rep(i,,n)rep(j,,m){
C[i][j]=gi();
if(i-)sum+=C[i][j];if(j-)sum+=C[i][j];if(i-n)sum+=C[i][j];if(j-m)sum+=C[i][j];
}
rep(i,,n)rep(j,,m){
if(i-)add(num[i][j],num[i-][j],C[i][j]+C[i-][j]);
if(j-)add(num[i][j],num[i][j-],C[i][j]+C[i][j-]);
if(i-n)add(num[i][j],num[i+][j],C[i][j]+C[i+][j]);
if(j-m)add(num[i][j],num[i][j+],C[i][j]+C[i][j+]);
}
while(BFS())memcpy(head,fir,sizeof head),sum-=Dinic(S,inf);
printf("%d\n",sum);
return ;
}

【BZOJ 2132】圈地计划 && 【7.22Test】计划的更多相关文章

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

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

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

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

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

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

  4. bzoj 2132: 圈地计划

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

  5. bzoj 2132 圈地计划【最小割+dinic】

    对于网格图,尤其是这种要求相邻各自不同的,考虑黑白染色 对于这张染色后图来说: 对于每个黑格: 表示初始时选择商业区: s点向它连商业区收益的流量,它向t点连工业区收益的流量: 割断S侧的边说明反悔, ...

  6. 如何使用windows的计划任务?计划任务?

    我们经常有一些程序想要过了几小时来运行:比如定时关机 或者说希望能够每天的几点执行一个什么程序: 这些所有的操作都需要用到windows的任务计划:或者叫计划任务:反正都一样 下面小编将指导大家创建一 ...

  7. bzoj 3232: 圈地游戏

    bzoj 3232: 圈地游戏 01分数规划,就是你要最大化\(\frac{\sum A}{\sum B}\),就二分这个值,\(\frac{\sum A}{\sum B} \geq mid\) \( ...

  8. 易普优APS(高级计划排程)演绎饭局模型(通俗的告诉您ERP计划与APS计划的区别)

    一天中午,老张突然回到家里对妻子说:“亲爱的老婆,晚上几个同事要来家里吃饭.这次我专门回家来要用最先进的ERP理念来完成咱家的请客过程了,要把这次宴会搞成一次ERP家宴.你看,我已经用CRM客户关系管 ...

  9. 【转】如何使用windows的计划任务?计划任务?

    我们经常有一些程序想要过了几小时来运行:比如定时关机 或者说希望能够每天的几点执行一个什么程序: 这些所有的操作都需要用到windows的任务计划:或者叫计划任务:反正都一样 下面小编将指导大家创建一 ...

随机推荐

  1. Python基础第一篇-------python的介绍

    一.python的介绍 python的创始人为吉多·范罗苏姆(Guido van Rossum).1989年的圣诞节期间,吉多·范罗苏姆(中文名字:龟叔)为了在阿姆斯特丹打发时间,决心开发一个新的脚本 ...

  2. 生成器(generator),迭代器(yield)

    g=(i for i in range(10)) #小括号表示生成一个迭代生成器.[]是列表生成器 g.__next__() yield将一个函数变成生成器 import time def f(): ...

  3. 网络编程--Socket(套接字)

    网络编程 网络编程的目的就是指直接或间接地通过网络协议与其他计算机进行通讯.网络编程中 有两个主要的问题,一个是如何准确的定位网络上一台或多台主机,另一个就是找到主机后 如何可靠高效的进行数据传输.在 ...

  4. VRSProcess(二)

    1._beginthreadex再谈 Windows操作系统提供了这样的一种解决方案——每个线程都将拥有自己专用的一块内存区域来供标准C运行库中所有有需要的函数使用.而且这块内存区域的创建就是由C/C ...

  5. 面向对象程序设计_课堂作业_01_Circle

    The 1st classwork of the C++ program 题目: Create a program that asks for the radius of a circle and p ...

  6. Alpha 冲刺报告(8/10)

    Alpha 冲刺报告(8/10) 队名:洛基小队 峻雄(组长) 已完成:关于角色属性的脚本编码 明日计划:提升脚本的完成度 剩余任务:角色的属性脚本 困难:缺乏编程经验,很难自己独立完成编写,只能根据 ...

  7. 原生js实现一个DIV的碰撞反弹运动,并且添加重力效果

    继上一篇... 原生js实现一个DIV的碰撞反弹运动,并且添加重力效果 关键在于边界检测,以及乘以的系数问题,实现代码并不难,如下: <!DOCTYPE html> <html la ...

  8. 初探tp

    现在对前端的要求越来越高了  基本上身为一个前端人员需要会一种后台语言,于是选择了当下流行的php.因为是自学对我这个不怎么懂代码的人来说还是有点难度的. 1.先看看thinkphp的目录结构 1 ├ ...

  9. [AHOI2009]最小割

    题目 最小割的可行边和必须边 可行边\((u,v)\)需要满足以下两个条件 满流 残量网络中不存在\(u\)到\(v\)的路径 这个挺好理解的呀,如果存在还存在路径的话那么这条边就不会是瓶颈了 必须边 ...

  10. Loj #2256. 「SNOI2017」英雄联盟

    题目 我就是个丝薄 如果要用\(dp_i\)表示凑出\(i\)的最小花费显然不可能的 之后大力猜想能凑出来的状态不会很多,我的暴力也告诉我不是很多,好像也确实不多的样子,大概\(4e4\)左右 但是我 ...