【BZOJ2132】圈地计划

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

题解:如果相邻的两点相同,则获得收益,那么这就变成最小割的裸题了。那么不同怎么办呢?黑白染色,黑点翻转源汇即可。

  1. #include <cstdio>
  2. #include <cstring>
  3. #include <iostream>
  4. #include <queue>
  5. #define P(A,B) ((A-1)*m+B)
  6. using namespace std;
  7. const int inf=1<<30;
  8. queue<int> q;
  9. int n,m,tot,S,T,ans,cnt=1;
  10. int dx[]={1,0,-1,0},dy[]={0,1,0,-1};
  11. int A[110][110],B[110][110],C[110][110],d[100010],head[100010],next[2000010],val[2000010],to[2000010];
  12. void add(int a,int b,int c)
  13. {
  14. to[++cnt]=b,val[cnt]=c,next[cnt]=head[a],head[a]=cnt;
  15. to[++cnt]=a,val[cnt]=c,next[cnt]=head[b],head[b]=cnt;
  16. }
  17. int dfs(int x,int mf)
  18. {
  19. if(x==T) return mf;
  20. int i,k,temp=mf;
  21. for(i=head[x];i;i=next[i])
  22. {
  23. if(d[to[i]]==d[x]+1&&val[i])
  24. {
  25. k=dfs(to[i],min(temp,val[i]));
  26. if(!k) d[to[i]]=0;
  27. val[i]-=k,val[i^1]+=k,temp-=k;
  28. if(!temp) break;
  29. }
  30. }
  31. return mf-temp;
  32. }
  33. int bfs()
  34. {
  35. memset(d,0,sizeof(d));
  36. while(!q.empty()) q.pop();
  37. int i,u;
  38. q.push(S),d[S]=1;
  39. while(!q.empty())
  40. {
  41. u=q.front(),q.pop();
  42. for(i=head[u];i;i=next[i])
  43. {
  44. if(!d[to[i]]&&val[i])
  45. {
  46. d[to[i]]=d[u]+1;
  47. if(to[i]==T) return 1;
  48. q.push(to[i]);
  49. }
  50. }
  51. }
  52. return 0;
  53. }
  54. inline int rd()
  55. {
  56. int ret=0,f=1; char gc=getchar();
  57. while(gc<'0'||gc>'9') {if(gc=='-')f=-f; gc=getchar();}
  58. while(gc>='0'&&gc<='9') ret=ret*10+gc-'0',gc=getchar();
  59. return ret*f;
  60. }
  61. int main()
  62. {
  63. n=rd(),m=rd(),S=0,T=n*m+1;
  64. int i,j,k,a,b;
  65. for(i=1;i<=n;i++) for(j=1;j<=m;j++) A[i][j]=rd(),ans+=A[i][j];
  66. for(i=1;i<=n;i++) for(j=1;j<=m;j++) B[i][j]=rd(),ans+=B[i][j];
  67. for(i=1;i<=n;i++) for(j=1;j<=m;j++) C[i][j]=rd();
  68. for(i=1;i<=n;i++) for(j=1;j<=m;j++)
  69. {
  70. a=P(i,j);
  71. if((i^j)&1) add(S,a,A[i][j]),add(a,T,B[i][j]);
  72. else add(S,a,B[i][j]),add(a,T,A[i][j]);
  73. for(k=0;k<4;k++) if(i+dx[k]&&j+dy[k]&&i+dx[k]<=n&&j+dy[k]<=m)
  74. {
  75. b=P(i+dx[k],j+dy[k]),ans+=C[i][j];
  76. add(a,b,C[i][j]);
  77. }
  78. }
  79. while(bfs()) ans-=dfs(S,inf);
  80. printf("%d",ans);
  81. return 0;
  82. }

【BZOJ2132】圈地计划 最小割的更多相关文章

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

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

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

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

  3. bzoj2132圈地计划

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

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

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

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

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

  6. bzoj2132: 圈地计划

    要分成两坨对吧.. 所以显然最小割 但是不兹辞啊.. 最小割是最小的啊 求最大费用怎么玩啊 那咱们就把所有费用都加起来,减掉一个最小的呗 但是两个属于不同集合的点贡献的价值是负的啊 网络流怎么跑负的啊 ...

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

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

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

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

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

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

随机推荐

  1. Web模糊测试工具Powerfuzzer

    Web模糊测试工具Powerfuzzer   Powerfuzzer是Kali Linux自带的一款Web模糊测试工具.该工具基于各种开源模糊测试工具构建,集成了大量安全信息.该工具高度智能化,它能根 ...

  2. 搭建 Maven ---基础入门

    这篇随笔从最基础的控制台  搭建maven讲,后面再升入的讲解IDEA搭建Maven. 一,Maven是什么?作用是什么? Maven是一个项目管理工具,它包含了一个项目对象模型 (Project O ...

  3. Linux文件名命名规范

    注意:在Linux下全部文件和文件夹命名都是小写的! Linux系统区分英文字符的大小写.命名目录和命名文件的规则是相同的.除非有特别的原因,否则用户创建的文件和目录名要使用小写字符.大多数的Linu ...

  4. 【java】TreeMap/HashMap的循环迭代中 keySet和entrySet和forEach方式 + map的几种迭代方式

    参考链接:https://www.cnblogs.com/crazyacking/p/5573528.html ================================== java紫色代表迭 ...

  5. HTML5 Canvas 绘制旋转45度佛教万字

    效果如下: 代码如下: <!DOCTYPE html> <html lang="utf-8"> <meta http-equiv="Cont ...

  6. 数据结构之---C语言实现图的数组(邻接矩阵)存储表示

    //图的数组(邻接矩阵)存储表示 #include <stdio.h> #include <stdlib.h> #define MAX_VEX_NUM 50 typedef c ...

  7. DFRobot万物互联大赛第二轮

    前言 最近放在阳台的花草被啥东西给吃了,然后厨房挂在墙上的小虾米也不知道咋的被抓破吃光了(我怀疑是隔隔壁两条泰迪),所以打算做个简单的项目,教训一下偷吃贼.时间比较仓促,内容比较多,能力有比较有限,好 ...

  8. Oracle中group by 的扩展函数rollup、cube、grouping sets

    Oracle的group by除了基本使用方法以外,还有3种扩展使用方法,各自是rollup.cube.grouping sets.分别介绍例如以下: 1.rollup 对数据库表emp.如果当中两个 ...

  9. 【Python】matplotlib绘制折线图

    一.绘制简单的折线图 import matplotlib.pyplot as plt squares=[1,4,9,16,25] plt.plot(squares) plt.show() 我们首先导入 ...

  10. xshell的快捷键(很有用)

    删除 ctrl + d      删除光标所在位置上的字符相当于VIM里x或者dl ctrl + h      删除光标所在位置前的字符相当于VIM里hx或者dh ctrl + k      删除光标 ...