描述

给你一个m*n的格子的棋盘,每个格子里面有一个非负数。
从中取出若干个数,使得任意的两个数所在的格子没有公共边,就是说所取数所在的2个格子不能相邻,并且取出的数的和最大。

输入

包括多个测试实例,每个测试实例包括2整数m,n和m行n列的非负数(m<=50,n<=50)

输出

对于每个测试实例,输出可能取得的最大的和

样例输入

3 3
75 15 21
75 15 28
34 70 5

样例输出

188

题意

如上

题解

最大点权独立集=总权值-最小点权覆盖

用最小割跑出来的是最小点权覆盖,再用sum-最小点权覆盖

把图黑白染色,黑色点连源点S流量a[i][j],白色点连汇点T流量a[i][j],然后每个相邻的黑白点连黑白边流量INF,跑最小割即可

代码

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3.  
  4. const int maxn=1e5+;
  5. const int maxm=2e5+;
  6. int n,m,S,T;
  7. int deep[maxn],q[];
  8. int FIR[maxn],TO[maxm],CAP[maxm],COST[maxm],NEXT[maxm],tote;
  9.  
  10. void add(int u,int v,int cap)
  11. {
  12. TO[tote]=v;
  13. CAP[tote]=cap;
  14. NEXT[tote]=FIR[u];
  15. FIR[u]=tote++;
  16.  
  17. TO[tote]=u;
  18. CAP[tote]=;
  19. NEXT[tote]=FIR[v];
  20. FIR[v]=tote++;
  21. }
  22. bool bfs()
  23. {
  24. memset(deep,,sizeof deep);
  25. deep[S]=;q[]=S;
  26. int head=,tail=;
  27. while(head!=tail)
  28. {
  29. int u=q[++head];
  30. for(int v=FIR[u];v!=-;v=NEXT[v])
  31. {
  32. if(CAP[v]&&!deep[TO[v]])
  33. {
  34. deep[TO[v]]=deep[u]+;
  35. q[++tail]=TO[v];
  36. }
  37. }
  38. }
  39. return deep[T];
  40. }
  41. int dfs(int u,int fl)
  42. {
  43. if(u==T)return fl;
  44. int f=;
  45. for(int v=FIR[u];v!=-&&fl;v=NEXT[v])
  46. {
  47. if(CAP[v]&&deep[TO[v]]==deep[u]+)
  48. {
  49. int Min=dfs(TO[v],min(fl,CAP[v]));
  50. CAP[v]-=Min;CAP[v^]+=Min;
  51. fl-=Min;f+=Min;
  52. }
  53. }
  54. if(!f)deep[u]=-;
  55. return f;
  56. }
  57. int maxflow()
  58. {
  59. int ans=;
  60. while(bfs())
  61. ans+=dfs(S,<<);
  62. return ans;
  63. }
  64. void init()
  65. {
  66. tote=;
  67. memset(FIR,-,sizeof FIR);
  68. }
  69. int N,M,a[][],color[][],has[][],tot,sum,f;
  70. int main()
  71. {
  72. while(cin>>N>>M)
  73. {
  74. init();
  75. memset(color,,sizeof color);
  76. tot=sum=;
  77. for(int i=;i<=N;i++)
  78. {
  79. if(i&)f=;
  80. else f=-;
  81. for(int j=;j<=M;f*=-,j++)
  82. {
  83. scanf("%d",&a[i][j]);
  84. sum+=a[i][j];
  85. has[i][j]=tot++;
  86. color[i][j]=f;
  87. }
  88. }
  89. S=tot,T=S+;
  90. for(int i=;i<=N;i++)
  91. for(int j=;j<=M;j++)
  92. {
  93. if(color[i][j]==)
  94. add(S,has[i][j],a[i][j]);
  95. else
  96. add(has[i][j],T,a[i][j]);
  97. if(color[i-][j]==-)add(has[i][j],has[i-][j],<<);
  98. if(color[i+][j]==-)add(has[i][j],has[i+][j],<<);
  99. if(color[i][j-]==-)add(has[i][j],has[i][j-],<<);
  100. if(color[i][j+]==-)add(has[i][j],has[i][j+],<<);
  101. }
  102. cout<<sum-maxflow()<<'\n';
  103. }
  104. return ;
  105. }

TZOJ 3665 方格取数(2)(最大点权独立集)的更多相关文章

  1. HDU 1565 1569 方格取数(最大点权独立集)

    HDU 1565 1569 方格取数(最大点权独立集) 题目链接 题意:中文题 思路:最大点权独立集 = 总权值 - 最小割 = 总权值 - 最大流 那么原图周围不能连边,那么就能够分成黑白棋盘.源点 ...

  2. HDU 1569 - 方格取数(2) - [最大点权独立集与最小点权覆盖集]

    嗯,这是关于最大点权独立集与最小点权覆盖集的姿势,很简单对吧,然后开始看题. 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1569 Time Limi ...

  3. hdu1569 方格取数(2) 最大点权独立集=总权和-最小点权覆盖集 (最小点权覆盖集=最小割=最大流)

    /** 转自:http://blog.csdn.net/u011498819/article/details/20772147 题目:hdu1569 方格取数(2) 链接:https://vjudge ...

  4. hdu1569 方格取数 求最大点权独立集

    题意:一个方格n*m,取出一些点,要求两两不相邻,求最大和.思路:建图,相邻的点有一条边,则建立了一个二分图,求最大点权独立集(所取点两两无公共边,权值和最大),问题转化为求总权和-最小点权覆盖集(点 ...

  5. hdu - 1565 方格取数(1) && 1569 方格取数(2) (最大点权独立集)

    http://acm.hdu.edu.cn/showproblem.php?pid=1565 两道题只是数据范围不同,都是求的最大点权独立集. 我们可以把下标之和为奇数的分成一个集合,把下标之和为偶数 ...

  6. LibreOJ #6007. 「网络流 24 题」方格取数 最小割 最大点权独立集 最大流

    #6007. 「网络流 24 题」方格取数 内存限制:256 MiB时间限制:1000 ms标准输入输出 题目类型:传统评测方式:文本比较 上传者: 匿名 提交提交记录统计讨论测试数据   题目描述 ...

  7. hdu 4859 最大点权独立集的变形(方格取数的变形)

    /*刚开始不会写,最大点权独立集神马都不知道,在潘神的指导下终于做出来,灰常感谢ps: 和方格取数差不多奇偶建图,对于D必割点权为0,对于.必然不割点权为inf.然后和方格取数差不多的建图 .--.| ...

  8. hdu 3657 最大点权独立集变形(方格取数的变形最小割,对于最小割建图很好的题)

    转载:http://blog.csdn.net/cold__v__moon/article/details/7924269 /* 这道题和方格取数2相似,是在方格取数2的基础上的变形. 方格取数2解法 ...

  9. 【最大点权独立集】【HDU1565】【方格取数】

    题目大意: 给你一个n*n的格子的棋盘,每个格子里面有一个非负数. 从中取出若干个数,使得任意的两个数所在的格子没有公共边,就是说所取的数所在的2个格子不能相邻,并且取出的数的和最大. 初看: 没想法 ...

随机推荐

  1. VirtualBox安装增强工具方法

    1.http://blog.csdn.net/wuliowen/article/details/71541561 2.https://segmentfault.com/a/11900000062335 ...

  2. html _ 提取html片段内的纯文本

    var html = “html字符串”;var textstr =html.replace(/<[^>]*>|/g,"");//纯文本

  3. Net操作Excel_NPOI

    Npoi 简介 1.整个Excel表格叫做工作表:WorkBook(工作薄),包含的叫页(工作表):Sheet:行:Row:单元格Cell. 2.Npoi 下载地址:http://npoi.codep ...

  4. hdoj 1003 学习思路

    基本解题思路:动态规划,不考虑穷举,分治. 根据网上,状态转移方程是:MaxSum[i] = Max{ MaxSum[i-1] + A[i], A[i]} 翻译公式:到当前位置i 时,最大子序列和为: ...

  5. Flex_布局和容器

    1.Halo组件也称MX组件,是Flex3的独有组件(按钮.文本字段.容器等).而Flex4引入了新一代的组件,称为Spark.   Flex4同时支持Halo和Spark.但是很多Halo组件都有更 ...

  6. centos6.9出现openvpn:error=certificate signature failure的处理

    原因: 将原来openwrt上用的证书复制到centos 6.9后,客户端都连不上了,查了服务器log,出现是error=certificate signature failure错误. 处理方法见帖 ...

  7. Oracle数据库中的数据出错的解决办法

    http://www.jcwcn.com/article/database/oracle/ 今天上班犯了一个严重的错误:把我们系统所使用的Oracle数据库中的数据给改掉了!当发现自己改错时,顿时冒了 ...

  8. linux目录结构详解(以suse linux 10为例)

    一.文件系统结构 位于Linux系统的最顶端即根目录是/.Linux的文件系统的入口就是/,所有的目录.文件.设备都在/之下,/就是Linux文件系统的组织者,也是最上级的领导者. 它之下的子目录有: ...

  9. C++ 将数据转为字符串的几种方法

    收集一下: 1\将int 转为 LPCTSTR 其实LPCTSTR可以直接使用CString直接代替,无需类型强制转换 CString str; ; //str="15" str. ...

  10. EF 踩过的坑

    ef + mysql-8.0.12-winx64 这个版本的mysql,当一个类为树型结构,会迁移报错. 数据迁移提示:No connection string named 'TaoBaoEntiti ...