网络流/最小割


  Orz Hzwer

  这类大概是最小割建模中的经典应用吧……

  黑白染色,然后反转黑色的技巧感觉很巧妙!这个转化太神奇了……

  1. /**************************************************************
  2. Problem: 2132
  3. User: Tunix
  4. Language: C++
  5. Result: Accepted
  6. Time:0 ms
  7. Memory:6252 kb
  8. ****************************************************************/
  9.  
  10. //BZOJ 2132
  11. #include<vector>
  12. #include<cstdio>
  13. #include<cstring>
  14. #include<cstdlib>
  15. #include<iostream>
  16. #include<algorithm>
  17. #define rep(i,n) for(int i=0;i<n;++i)
  18. #define F(i,j,n) for(int i=j;i<=n;++i)
  19. #define D(i,j,n) for(int i=j;i>=n;--i)
  20. #define FOR for(int i=1;i<=n;i++)for(int j=1;j<=m;j++)
  21. #define pb push_back
  22. using namespace std;
  23. inline int getint(){
  24. int v=,sign=; char ch=getchar();
  25. while(ch<''||ch>''){ if (ch=='-') sign=-; ch=getchar();}
  26. while(ch>=''&&ch<=''){ v=v*+ch-''; ch=getchar();}
  27. return v*sign;
  28. }
  29. const int N=,M=,INF=~0u>>;
  30. const int fx[]={,,-,},
  31. fy[]={,,,-};
  32. typedef long long LL;
  33. /******************tamplate*********************/
  34. int n,m,a[][],b[][],c[][],color[][],tot,ans;
  35. struct edge{
  36. int from,to,v;
  37. };
  38. inline int pack(int i,int j){ return (i-)*m+j; }
  39. struct Net{
  40. edge E[M];
  41. int head[N],next[M],cnt;
  42. bool vis[][];
  43. void ins(int x,int y,int v){
  44. E[++cnt]=(edge){x,y,v};
  45. next[cnt]=head[x]; head[x]=cnt;
  46. }
  47. void add(int x,int y,int v){
  48. ins(x,y,v); ins(y,x,);
  49. }
  50. void add2(int x,int y,int v){
  51. ins(x,y,v); ins(y,x,v);
  52. }
  53. int s,t,d[N],Q[N];
  54. void init(){
  55. n=getint();m=getint();
  56. cnt=;tot=ans=;
  57. s=;t=n*m+;
  58. int x,y;
  59. memset(a,-,sizeof a);
  60. FOR a[i][j]=getint();
  61. FOR b[i][j]=getint();
  62. FOR c[i][j]=getint();
  63. FOR if ((i+j)&) color[i][j]=;
  64. FOR{
  65. if (color[i][j]) swap(a[i][j],b[i][j]);
  66. tot+=a[i][j]+b[i][j];
  67. add(s,pack(i,j),a[i][j]);
  68. add(pack(i,j),t,b[i][j]);
  69. if (color[i][j]) rep(k,){
  70. int tx=i+fx[k],ty=j+fy[k];
  71. if (!tx||!ty||tx>n||ty>m) continue;
  72. add2(pack(i,j),pack(tx,ty),c[i][j]+c[tx][ty]);
  73. tot+=c[i][j]+c[tx][ty];
  74. }
  75. }
  76. }
  77. bool mklevel(){
  78. memset(d,-,sizeof d);
  79. d[s]=;
  80. int l=,r=-;
  81. Q[++r]=s;
  82. while(l<=r){
  83. int x=Q[l++];
  84. for(int i=head[x];i;i=next[i])
  85. if (d[E[i].to]==- && E[i].v){
  86. d[E[i].to]=d[x]+;
  87. Q[++r]=E[i].to;
  88. }
  89. }
  90. return d[t]!=-;
  91. }
  92. int dfs(int x,int a){
  93. if(x==t)return a;
  94. int flow=;
  95. for(int i=head[x];i && flow<a;i=next[i])
  96. if (d[E[i].to]==d[x]+ && E[i].v){
  97. int f=dfs(E[i].to,min(a-flow,E[i].v));
  98. E[i].v-=f;
  99. E[i^].v+=f;
  100. flow+=f;
  101. }
  102. if (!flow) d[x]=-;
  103. return flow;
  104. }
  105. void Dinic(){
  106. while(mklevel()) ans+=dfs(s,INF);
  107. }
  108. }G1;
  109. int main(){
  110. #ifndef ONLINE_JUDGE
  111. freopen("2132.in","r",stdin);
  112. freopen("2132.out","w",stdout);
  113. #endif
  114. G1.init(); G1.Dinic();
  115. printf("%d\n",tot-ans);
  116. return ;
  117. }

2132: 圈地计划

Time Limit: 2 Sec  Memory Limit: 256 MB
Submit: 515  Solved: 228
[Submit][Status][Discuss]

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

[Submit][Status][Discuss]

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

  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. BZOJ 2131 圈地计划(最小割+黑白染色)

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

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

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

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

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

  9. BZOJ 5424: 烧桥计划

    BZOJ 5424: 烧桥计划 目前暂居rk1QAQ 首先,设\(f[i][k]\)为前i个点中,选了第i个点,总共选了k个点的答案.那么就有: \[f[i][k]=min_{j<i}\{f[j ...

随机推荐

  1. window.open和window.showdialog区别

    open打开的窗口可以点击切换到其背后的父窗口,dialog的窗口无法点击切换到其背后的父窗口, 假如用window.opener或者parent等对象时,建议用open方法,不要用dialog,否则 ...

  2. Objective-C 【Category-非正式协议-延展】

    -------------------------------------------  类别(Category)的声明和实现 实质:类别又叫类目,它其实是对类的一个拓展!但是他不同于继承后的拓展! ...

  3. [翻译.每月一译.每日一段]Exploring Fonts with DirectWrite and Modern C++

    Windows with C++ Exploring Fonts with DirectWrite and Modern C++ Kenny Kerr DirectWrite is an incred ...

  4. 【风马一族_Android】Android Studio 给APP设置签名

    在Android Studio中,给App签名,如果没有给App设置签名的话,Android Studio会主动给app设置一个默认的签名 接下来,介绍主动给App设置一个签名的整个步骤过程: 1) ...

  5. Azure + vsftpd + ubntu14 + 虚拟用户 遇到的问题:从网上摘抄

    :在Azure安装好ubuntu虚拟机,安装包选择ubuntu14.04 LTS,选择LTS,以便微软对其以后的更好支持,不选就可能技术支持不会很久,现只开一台,端口默认选择22 :打开虚拟机,进入端 ...

  6. iOS相机操作笔记

    最近忙于项目,需要拍摄图片,这里先列出部分测试代码. // // FirstViewController.m // UiTest // // Created by Tang Huaming on 16 ...

  7. JS获取图片实际宽高及根据图片大小进行自适应

    JS获取图片实际宽高,以及根据图片大小进行自适应  <img src="http://xxx.jpg" id="imgs" onload="ad ...

  8. LoadRunner报26612错误的解决方案

    LoadRunner压力测试时,一直会报12261错误,错误内容大概如下: Error -26612: HTTP Status-Code=500 (Internal Server Error) for ...

  9. Sandcastle是什么

    如果你的项目是.net开发,同时需要生成HTML的方法成员文档时,哪么就不得不拿出Sandcastle 因为Sandcastle是微软开发,并开源的文档生成工具; 这种生成进度等待的感觉很爽! 在这里 ...

  10. unity--IOC框架资料整理

    今天在网上找了一些unity资料研究,出了好多问题,编译无法通过,经人指点总算成功编译运行,做个笔记,整理如下: 一.下载unity: 二.在项目中添加Microsoft.Practices.Unit ...