1. /*
  2. 最大点权独立集=总权值-最小点权覆盖集
  3. 最大点权独立集=最大流
  4. 最小点权覆盖集=最小割
  5.  
  6. 题意:
  7. 给你一个m*n的格子的棋盘,每个格子里面有一个非负数。
  8. 从中取出若干个数,使得任意的两个数所在的格子没有公共边,就是说所取数所在的2个格子不能相邻,并且取出的数的和最大。
  9. 根据奇偶建立二分图,
  10. if(i+j)%2==0 源点和该点连接,权值为该点的点权,
  11. if(i+j)%2==1 该点和汇点连接,权值为该点的点权,
  12. 之后若i+j为偶数的点和i+j为奇数的点之间相邻,那么就连一条从为偶数的点到为奇数的点的边,权值为无穷大
  13. */
  14. #include<stdio.h>
  15. #include<string.h>
  16. #include<stdlib.h>
  17. #include<algorithm>
  18. #include<iostream>
  19. #include<math.h>
  20. using namespace std;
  21. const int inf = 0x3f3f3f3f;
  22. const int maxn = ;
  23. const int maxm = ;
  24. const int dx[]={,-,,};
  25. const int dy[]={,,,-};
  26. struct Node{
  27. int u,v,next,val;
  28. }edge[ maxm ];
  29. int head[ maxn ],cnt;
  30. void init(){
  31. cnt = ;
  32. memset( head,-,sizeof( head ) );
  33. }
  34. void addedge( int a,int b,int c ){
  35. edge[ cnt ].u = a;
  36. edge[ cnt ].v = b;
  37. edge[ cnt ].val = c;
  38. edge[ cnt ].next = head[ a ];
  39. head[ a ] = cnt++;
  40.  
  41. edge[ cnt ].u = b;
  42. edge[ cnt ].v = a;
  43. edge[ cnt ].val = ;
  44. edge[ cnt ].next = head[ b ];
  45. head[ b ] = cnt++;
  46. }
  47.  
  48. int queue[ maxn ];
  49. int lev[ maxn ];
  50. int Dinic( int start,int end ){
  51. int max_flow = ;
  52. while( true ){
  53. int Head,Tail,id;
  54. Head = Tail = ;
  55. queue[ Tail++ ] = start;
  56. memset( lev,-,sizeof( lev ) );
  57. lev[ start ] = ;
  58. while( Head<Tail ){
  59. id = head[ queue[ Head++ ] ];
  60. while( id!=- ){
  61. if( edge[ id ].val>&&lev[edge[id].v]==- ){
  62. lev[edge[id].v] = lev[edge[id].u]+;
  63. queue[Tail++] = edge[id].v;
  64. if( edge[id].v==end ){
  65. Head = Tail;
  66. break;//分层完成
  67. }
  68. }
  69. id = edge[id].next;
  70. }
  71. }//bfs构造层次网络
  72.  
  73. if( lev[end]==- ) break;
  74.  
  75. id = start;
  76. Tail = ;
  77. //这里queue被当作stack来用
  78. while( true ){//层次网络中进行dfs
  79. if( id==end ){//dfs找到汇点
  80. int flow = inf;
  81. int flag = -;
  82. for( int i=;i<Tail;i++ ){
  83. if( edge[queue[i]].val<flow ){
  84. flow = edge[queue[i]].val;
  85. flag = i;
  86. }
  87. }//寻找最小的边
  88. for( int i=;i<Tail;i++ ){
  89. edge[ queue[i] ].val -= flow;
  90. edge[ queue[i]^ ].val += flow;
  91. }
  92. if( flag!=- )
  93. {
  94. max_flow += flow;
  95. Tail = flag;
  96. id = edge[ queue[flag] ].u;
  97. }
  98. else
  99. return inf;
  100. }
  101. id = head[ id ];
  102. while( id!=- ){
  103. if( edge[id].val>&&(lev[edge[id].u]+==lev[edge[id].v]) ){
  104. break;
  105. }
  106. id = edge[id].next;
  107. }
  108. if( id!=- ){
  109. queue[Tail++] = id;
  110. id = edge[id].v;
  111. }
  112. else{
  113. if( Tail== ) break;
  114. lev[ edge[queue[Tail-]].v ] = -;
  115. id = edge[queue[--Tail]].u;
  116. }
  117. }
  118. }
  119. return max_flow;
  120. }
  121. int main(){
  122. int m,n;
  123. while( scanf("%d%d",&n,&m)!=EOF ){
  124. init();
  125. int sum = ;
  126. int temp;
  127. for( int i=;i<=n;i++ ){
  128. for( int j=;j<=m;j++ ){
  129. scanf("%d",&temp);
  130. if( (i+j)%== ){
  131. addedge( ,(i-)*m+j,temp );
  132. }
  133. else{
  134. addedge( (i-)*m+j,n*m+,temp );
  135. }
  136. sum += temp;
  137. }
  138. }
  139. for( int i=;i<=n;i++ ){
  140. for( int j=;j<=m;j++ ){
  141. if( (i+j)%== ){
  142. for( int k=;k<;k++ ){
  143. int tx = i+dx[k];
  144. int ty = j+dy[k];
  145. if( tx>=&&tx<=n&&ty>=&&ty<=m ){
  146. addedge( (i-)*m+j,(tx-)*m+ty,inf );
  147. }
  148. }
  149. }
  150. }
  151. }
  152. int start = ;
  153. int end = n*m+;
  154. int ans = Dinic( start,end );
  155. //printf("sum = %d,ans = %d\n",sum,ans);
  156. printf("%d\n",sum-ans);
  157. }
  158. return ;
  159. }

HDU1569+最大点权集的更多相关文章

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

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

  2. hdu1565+hdu1569(最大点权独立集)

    传送门:hdu1565 方格取数(1) 传送门:hdu1569 方格取数(2) 定理:1. 最小点权覆盖集=最小割=最大流2. 最大点权独立集=总权-最小点权覆盖集 步骤: 1. 先染色,取一个点染白 ...

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

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

  4. 最小点权覆盖集&最大点权独立集

    最小点权覆盖集 二分图最小点权覆盖集解决的是这样一个问题: 在二分图中,对于每条边,两个端点至少选一个,求所选取的点最小权值和. 方法: 1.先对图二分染色,对于每条边两端点的颜色不同 2.然后建立源 ...

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

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

  6. HDU1569 最大流(最大点权独立集)

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

  7. HDU 1565 最大点权独立集

    首先要明白图论的几个定义: 点覆盖.最小点覆盖: 点覆盖集即一个点集,使得所有边至少有一个端点在集合里.或者说是“点” 覆盖了所有“边”.. 最小点覆盖(minimum vertex covering ...

  8. zoj 3165 (最小割,最大点权独立集)

    胡伯涛的<最小割模型在信息学竞赛中的应用>写的真牛. 这道题是选择一些男孩和女孩参加party,邀请的男孩女孩之间不能有 8g,图就是个明显的二分图,就是选择一些点之间没有8g关系,就是二 ...

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

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

随机推荐

  1. COM 参数有in, out ,retval

    COM 参数有in, out ,retval 来源:http://blog.sina.com.cn/s/blog_472a9f0c01017uer.html In 输入参数,它的值不被返回    Ou ...

  2. Linux 查看系统版本及位数

    1. 查看内核版本命令: 1) [root@www ~]# cat /proc/version    Linux version 2.6.9-22.ELsmp (bhcompile@crowe.dev ...

  3. Normalize [ 浏览器渲染格式化 ]

    /*! normalize.css v3.0.2 | MIT License | git.io/normalize */ /** * 1. Set default font family to san ...

  4. json-lib-2.4.jar Bug,json字符串中value为"[value]"结构时,解析为数组,不会解析成字符串

    使用json-lib.jar 2.4进行json字符串转换为对象时发现一个bug.贴下测试代码: <dependency> <groupId>net.sf.json-lib&l ...

  5. java线程安全和线程同步

    第一部分 线程安全(1)——变量安全 http://blog.csdn.net/cuiran/article/details/6150357 第二部分 线程安全(2)——ThreadLocal变量 h ...

  6. preventDefault()、stopPropagation()、return false 之间的区别

    “return false”之所以被误用的如此厉害,是因为它看起来像是完成了我们交给它的工作,浏览器不会再将我们重定向到href中的链接,表单也不会被继续提交,但这么做到底有什么不对呢? 可能在你刚开 ...

  7. Node.js之【express 安装问题】

    经常在全局安装express后,在cmd里面会找不到express命令, 本地模式安装express:'express' 不是内部或外部命令,也不是可运行的程序或批处理文件. 1.先全局安装expre ...

  8. unionId突然不能获取的踩坑记录

    昨天(2016-2-2日),突然发现系统的一个微信接口使用不了了.后来经查发现,是在网页授权获取用户基本信息的时候,unionid获取失败导致的. 在网页授权获取用户基本信息的介绍中(http://m ...

  9. 跟着PHP100第一季学写一个CMS(1-10)

    笔记: 这次用的方法是先跟着视频做一遍,隔一天或半天后独立再做一遍,能发现真正不会的地方记录下来. CMS0.1界面布局1.问题:分两个css来实现时basic.css+index.php出现定位不正 ...

  10. c#中sqlhelper类的编写(一)

    在.net平台的项目开发中,凡是用到数据库交互的,都有必要了解SqlHelper类的原理. 步骤一: 我就拿WPF项目开发作为例子.首先要新建一个App.config(应用程序配置文件).注意,在VS ...