题目描述

最近房地产商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求出一个收益最大的方案么?

输入

输入第一行为两个整数,分别为正整数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”的限制

输出

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

样例输入

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

样例输出

81


题解

网络流最小割

只考虑相邻的两个,问题转化为:$i$和$j$各有两种选法:选择A可以获得$a_i$或$a_j$的收益;选择B可以获得$b_i$或$b_j$的收益;如果选择不同,则会获得$c_i+c_j$的收益。问最大收益。

这是一个经典的最小割模型,建图方法:S连向i,容量为$a_i$,i连向T,容量为b_i;S连向j,容量为$b_j$,i连向T,容量为$a_j$(这两步是反转源汇的过程)。i和j之间连容量为$c_i+c_j$的双向边。

因此总的建图为:黑白染色,黑点正常连,白点反转源汇,然后相邻的点之间连边。答案为$\sum\limits a_i+\sum\limits b_i+\sum\limits(c_i+c_j)-mincut$。

  1. #include <queue>
  2. #include <cstdio>
  3. #include <cstring>
  4. #define N 10010
  5. #define M 1000010
  6. #define pos(i , j) (i - 1) * m + j
  7. using namespace std;
  8. typedef long long ll;
  9. const int inf = 1 << 30;
  10. queue<int> q;
  11. int n , m , head[N] , to[M] , next[M] , cnt = 1 , s , t , dis[N];
  12. ll a[110][110] , b[110][110] , c[110][110] , val[M];
  13. void add(int x , int y , ll z)
  14. {
  15. to[++cnt] = y , val[cnt] = z , next[cnt] = head[x] , head[x] = cnt;
  16. to[++cnt] = x , val[cnt] = 0 , next[cnt] = head[y] , head[y] = cnt;
  17. }
  18. ll link(int x1 , int y1 , int x2 , int y2)
  19. {
  20. add(pos(x1 , y1) , pos(x2 , y2) , c[x1][y1] + c[x2][y2]);
  21. add(pos(x2 , y2) , pos(x1 , y1) , c[x1][y1] + c[x2][y2]);
  22. return c[x1][y1] + c[x2][y2];
  23. }
  24. bool bfs()
  25. {
  26. int x , i;
  27. memset(dis , 0 , sizeof(dis));
  28. while(!q.empty()) q.pop();
  29. dis[s] = 1 , q.push(s);
  30. while(!q.empty())
  31. {
  32. x = q.front() , q.pop();
  33. for(i = head[x] ; i ; i = next[i])
  34. {
  35. if(val[i] && !dis[to[i]])
  36. {
  37. dis[to[i]] = dis[x] + 1;
  38. if(to[i] == t) return 1;
  39. q.push(to[i]);
  40. }
  41. }
  42. }
  43. return 0;
  44. }
  45. ll dinic(int x , ll low)
  46. {
  47. if(x == t) return low;
  48. ll temp = low , k;
  49. int i;
  50. for(i = head[x] ; i ; i = next[i])
  51. {
  52. if(val[i] && dis[to[i]] == dis[x] + 1)
  53. {
  54. k = dinic(to[i] , min(temp , val[i]));
  55. if(!k) dis[to[i]] = 0;
  56. val[i] -= k , val[i ^ 1] += k;
  57. if(!(temp -= k)) break;
  58. }
  59. }
  60. return low - temp;
  61. }
  62. int main()
  63. {
  64. int i , j;
  65. ll ans = 0;
  66. scanf("%d%d" , &n , &m) , s = 0 , t = n * m + 1;
  67. for(i = 1 ; i <= n ; i ++ ) for(j = 1 ; j <= m ; j ++ ) scanf("%lld" , &a[i][j]);
  68. for(i = 1 ; i <= n ; i ++ ) for(j = 1 ; j <= m ; j ++ ) scanf("%lld" , &b[i][j]);
  69. for(i = 1 ; i <= n ; i ++ ) for(j = 1 ; j <= m ; j ++ ) scanf("%lld" , &c[i][j]);
  70. for(i = 1 ; i <= n ; i ++ )
  71. {
  72. for(j = 1 ; j <= m ; j ++ )
  73. {
  74. ans += a[i][j] + b[i][j];
  75. if((i & 1) ^ (j & 1)) add(s , pos(i , j) , b[i][j]) , add(pos(i , j) , t , a[i][j]);
  76. else
  77. {
  78. add(s , pos(i , j) , a[i][j]) , add(pos(i , j) , t , b[i][j]);
  79. if(i > 1) ans += link(i , j , i - 1 , j);
  80. if(i < n) ans += link(i , j , i + 1 , j);
  81. if(j > 1) ans += link(i , j , i , j - 1);
  82. if(j < m) ans += link(i , j , i , j + 1);
  83. }
  84. }
  85. }
  86. while(bfs()) ans -= dinic(s , inf);
  87. printf("%lld\n" , ans);
  88. return 0;
  89. }

【bzoj2132】圈地计划 网络流最小割的更多相关文章

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

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

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

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

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

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

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

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

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

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

  6. bzoj2132圈地计划

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

  7. 【题解】 bzoj3894: 文理分科 (网络流/最小割)

    bzoj3894,懒得复制题面,戳我戳我 Solution: 首先这是一个网络流,应该还比较好想,主要就是考虑建图了. 我们来分析下题面,因为一个人要么选文科要么选理科,相当于两条流里面割掉一条(怎么 ...

  8. 【bzoj3774】最优选择 网络流最小割

    题目描述 小N手上有一个N*M的方格图,控制某一个点要付出Aij的代价,然后某个点如果被控制了,或者他周围的所有点(上下左右)都被控制了,那么他就算是被选择了的.一个点如果被选择了,那么可以得到Bij ...

  9. 【bzoj1143】[CTSC2008]祭祀river Floyd+网络流最小割

    题目描述 在遥远的东方,有一个神秘的民族,自称Y族.他们世代居住在水面上,奉龙王为神.每逢重大庆典, Y族都会在水面上举办盛大的祭祀活动.我们可以把Y族居住地水系看成一个由岔口和河道组成的网络.每条河 ...

随机推荐

  1. OpenLayers项目分析——(一)项目介绍

    OpenLayers 是由MetaCarta公司开发的,用于WebGIS客户端的JavaScript包,目前的最高版本是2.7 V,通过BSD License 发行.它实现访问地理空间数据的方法都符合 ...

  2. 【BZOJ3123】[SDOI2013] 森林(启发式合并主席树)

    点此看题面 大致题意: 给你一片森林,有两种操作:询问两点之间的第\(k\)小点权和在两棵树之间连一条边. 前置技能:树上主席树 做这道题目,我们首先要会树上主席树. 关于树上主席树,这有一道很好的例 ...

  3. 关于C#的垃圾回收机制,Finalize和Dispose的区别(自认为很清晰了,有疑问的评论)

    来到个新地方,新学习C#,前面看到C#的垃圾回收,Finalize和Dispose时,总是一知半解,迷迷糊糊.这次好了,前面连续两次面试问到这个问题,脑子里不是很清晰,加上用英文来表达,更是雪上加霜的 ...

  4. 2018.6.2 AndroidStudio项目中的问题:===== oast.LENGTH_LONG和Toast.LENGTH_SHORT分别对应多长时间

    oast.LENGTH_LONG和Toast.LENGTH_SHORT分别对应多长时间 在Android源码中的NotificationManagerService.java这个类中定义了两个静态变量 ...

  5. OO终章

    一,第四单元架构设计 第一次作业:只有类图 1,重置MyClass,MyOperation等类,为使里面只有必要数据(name,id,visibility等).或方便组织数据(如MyClass作为其底 ...

  6. Java自带工具包StringUtils包含方法

    //导入包 import org.apache.commons.lang3.StringUtils //判断不为空 不包含空格 StringUtils.isNotEmpty(" " ...

  7. Solaris&&QNX® Neutrino®&&OpenVMS&&FreeBSD&&AIX

    原文链接Solaris (读作 /se'laris:/ 或者 /so'le:ris/ 或者 '梭拉瑞斯' )是Sun Microsystems研发的计算机 操作系统.它被认为是UNIX操作系统的衍生版 ...

  8. arcgis engine计算点到线的最短距离

    IProximityOperator接口用于获取两个几何图形的距离,以及给定一个Point,求另一个几何图形上离离给定点最近的点.IProximityOperator接口的主要方法有:QueryNea ...

  9. facebook的infer检测工具的安装

    缘由 由于公司产出代码的时候会使用静态扫描工具检测代码的质量,所以自己就想动手尝试一番infer整个的使用方式和使用效果,便动手安装了infer,结果安装过程中遇见太多的坑,导致很多时候都安装失败,这 ...

  10. eclipse中使用git上传项目

    eclipse中使用git上传项目 先需要上传到本地仓库 先找到此选项打钩 再如下 再添加的属性则可以自动填充邮箱和密码 之后 右键选择import 点击找到git 选中 下一步  如果没有找到git ...