将网格分为两部分,方法是黑白染色,即判断(i+j)&1即可,分开后从白色格子向黑色格子连边,每个点需要四条(边界点可能更少),也就是每个格子周围的四个方向。之后将源点和汇点分别于黑白格子连边,边权即为点权,最后用总权值减去最小割即可。

  1. #include <iostream>
  2. #include <algorithm>
  3. #include <cstdio>
  4. #include <cstdlib>
  5. #include <cstring>
  6. #include <cmath>
  7. #include <ctime>
  8. #include <queue>
  9.  
  10. using namespace std;
  11.  
  12. #define INF 0x3f3f3f3f
  13.  
  14. template<const int _n,const int _m>
  15. struct Edge
  16. {
  17. struct Edge_base { int to,next,w; }e[_m]; int cnt,p[_n];
  18. Edge() { clear(); }
  19. void insert(const int x,const int y,const int z)
  20. { e[++cnt].to=y; e[cnt].next=p[x]; e[cnt].w=z; p[x]=cnt; return ; }
  21. int start(const int x) { return p[x]; }
  22. void clear() { cnt=,memset(p,,sizeof(p)); }
  23. Edge_base& operator[](const int x) { return e[x]; }
  24. };
  25.  
  26. int n,m,N,SSS,TTT,a[][];
  27. int level[],cur[];
  28. Edge<,> e;
  29.  
  30. bool Bfs(const int S)
  31. {
  32. int i,t;
  33. queue<int> Q;
  34. memset(level,,sizeof(level));
  35. level[S]=;
  36. Q.push(S);
  37. while(!Q.empty())
  38. {
  39. t=Q.front(),Q.pop();
  40. for(i=e.start(t);i;i=e[i].next)
  41. {
  42. if(!level[e[i].to] && e[i].w)
  43. {
  44. level[e[i].to]=level[t]+;
  45. Q.push(e[i].to);
  46. }
  47. }
  48. }
  49. return level[TTT];
  50. }
  51.  
  52. int Dfs(const int S,const int bk)
  53. {
  54. if(S==TTT)return bk;
  55. int rest=bk;
  56. for(int &i=cur[S];i;i=e[i].next)
  57. {
  58. if(level[e[i].to]==level[S]+ && e[i].w)
  59. {
  60. int flow=Dfs(e[i].to,min(e[i].w,rest));
  61. e[i].w-=flow;
  62. e[i^].w+=flow;
  63. if((rest-=flow)<=)break;
  64. }
  65. }
  66. if(bk==rest)level[S]=;
  67. return bk-rest;
  68. }
  69.  
  70. int Dinic()
  71. {
  72. int flow=;
  73. while(Bfs(SSS))
  74. {
  75. memcpy(cur,e.p,sizeof(cur));
  76. flow+=Dfs(SSS,0x3f3f3f3f);
  77. }
  78. return flow;
  79. }
  80.  
  81. int main()
  82. {
  83. freopen("grid.in","r",stdin);
  84. freopen("grid.out","w",stdout);
  85.  
  86. int i,j,Sum=;
  87.  
  88. scanf("%d%d",&n,&m);
  89. N=n*m;SSS=N+,TTT=SSS+;
  90. for(i=;i<=n;++i)for(j=;j<=m;++j)
  91. scanf("%d",&a[i][j]),Sum+=a[i][j];
  92. for(i=;i<=n;++i)
  93. {
  94. for(j=;j<=m;++j)
  95. {
  96. int t=(i-)*m+j;
  97. if(((i&) && !(j&)) || (!(i&) && (j&)))
  98. {
  99. e.insert(SSS,t,a[i][j]);
  100. e.insert(t,SSS,);
  101. if(i>)e.insert(t,t-m,INF),e.insert(t-m,t,);
  102. if(i<n)e.insert(t,t+m,INF),e.insert(t+m,t,);
  103. if(j>)e.insert(t,t-,INF),e.insert(t-,t,);
  104. if(j<m)e.insert(t,t+,INF),e.insert(t+,t,);
  105. }
  106. else
  107. {
  108. e.insert(t,TTT,a[i][j]);
  109. e.insert(TTT,t,);
  110. if(i>)e.insert(t-m,t,INF),e.insert(t,t-m,);
  111. if(i<n)e.insert(t+m,t,INF),e.insert(t,t+m,);
  112. if(j>)e.insert(t-,t,INF),e.insert(t,t-,);
  113. if(j<m)e.insert(t+,t,INF),e.insert(t,t+,);
  114. }
  115. }
  116. }
  117.  
  118. printf("%d\n",Sum-Dinic());
  119.  
  120. return ;
  121. }

[网络流24题#9] [cogs734] 方格取数 [网络流,最大流最小割]的更多相关文章

  1. Luogu 2764 最小路径覆盖问题 / Libre 6002 「网络流 24 题」最小路径覆盖 (网络流,最大流)

    Luogu 2764 最小路径覆盖问题 / Libre 6002 「网络流 24 题」最小路径覆盖 (网络流,最大流) Description 给定有向图G=(V,E).设P是G的一个简单路(顶点不相 ...

  2. Luogu 2762 太空飞行计划 / Libre 6001 「网络流 24 题」太空飞行计划 (网络流,最大流)

    Luogu 2762 太空飞行计划 / Libre 6001 「网络流 24 题」太空飞行计划 (网络流,最大流) Description W 教授正在为国家航天中心计划一系列的太空飞行.每次太空飞行 ...

  3. BZOJ 1475: 方格取数( 网络流 )

    本来想写道水题....结果调了这么久!就是一个 define 里面少加了个括号 ! 二分图最大点权独立集...黑白染色一下 , 然后建图 : S -> black_node , white_no ...

  4. 网络流(最大流) HDU 1565 方格取数(1) HDU 1569 方格取数(2)

      HDU 1565 方格取数(1) 给你一个n*n的格子的棋盘,每个格子里面有一个非负数.从中取出若干个数,使得任意的两个数所在的格子没有公共边,就是说所取的数所在的2个格子不能相邻,并且取出的数的 ...

  5. [BZOJ1475]方格取数 网络流 最小割

    1475: 方格取数 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 1025  Solved: 512[Submit][Status][Discuss] ...

  6. HDU 1569 方格取数(2) (最小割)

    方格取数(2) Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Su ...

  7. P2774 方格取数(网络流)

    https://www.luogu.com.cn/problem/P2774 在一个有 m×n 个方格的棋盘中,每个方格中有一个正整数. 现要从方格中取数,使任意2个数所在方格没有公共边,且取出的数的 ...

  8. LuoguP2774 方格取数问题(最小割)

    题目背景 none! 题目描述 在一个有 m*n 个方格的棋盘中,每个方格中有一个正整数.现要从方格中取数,使任意 2 个数所在方格没有公共边,且取出的数的总和最大.试设计一个满足要求的取数算法.对于 ...

  9. 【PowerOJ1736&网络流24题】飞行员配对方案问题(最小割)

    题意: n<=100,要求输出方案 思路:准备把没刷的24题从头搞一遍 输出方案的话就在增广的时候记一下另一端的编号就好 #include<bits/stdc++.h> using ...

随机推荐

  1. java静态代理实例

    package test; class ProxyTest { public static void main(String[] args) { ProxyClass proxy = new Prox ...

  2. 网页分享URL

    <a href="tencent://Message/?Uin=QQ号码&Site=qq联系">点击联系</a> 1.新浪微博:<a href ...

  3. 【转载】sql索引存储结构

    一.引言 对数据库索引的关注从未淡出我的们的讨论,那么数据库索引是什么样的?聚集索引与非聚集索引有什么不同?希望本文对各位同仁有一定的帮助.有不少存疑的地方,诚心希望各位不吝赐教指正,共同进步.[最近 ...

  4. JavaScript中.和[]有什么区别?

    .与[]都可以用于读取或修改对象属性. <script> var myData={ name:"Adam", weather:"sunny", }; ...

  5. $tsinsenA1067$

    \(problem\) 这种题目需要一个定理 \(a[1]+a[2]+a[3]+a[4]...=(a[1]%mod)+...\) 本人出奇的懒 然后 动态规划?(恰似枚举) #include < ...

  6. [ NOIP 1998 ] TG

    \(\\\) \(\#A\) 车站 火车从第\(1\)站开出,上车的人数为\(a\),然后到达第\(2\)站,在第\(2\)站有人上.下车,但上.下车的人数相同,因此在第\(2\)站开出时(即在到达第 ...

  7. unity之Rigidbody属性

    Rigidbody属性 Mass表示物体的质量,数值类型为float,默认值为1.大部分物体的质量属性接近于0.1才符合日常生活感官感受,超过10 ,则失去了仿真效果. Drag表示平移阻力,其数值类 ...

  8. checkbox与文字混排无法对齐到一行的解决办法

    直接上代码: <span><input style="vertical-align:middle" type="checkbox" name= ...

  9. Win32基础知识整理

    1.定义字符串 在资源新建String table,增加新字符串: (win32加载) TCHAR tcIDName[255]=_T(""); LoadString(hInstan ...

  10. BAT文件如何注释

    1.BAT文件中如何注释: 1.:: 注释内容(第一个冒号后也可以跟任何一个非字母数字的字符) 2.rem 注释内容(不能出现重定向符号和管道符号) 3.echo 注释内容(不能出现重定向符号和管道符 ...