首先要明白图论的几个定义:

点覆盖、最小点覆盖:

  点覆盖集即一个点集,使得所有边至少有一个端点在集合里。或者说是“点” 覆盖了所有“边”。。

最小点覆盖(minimum vertex covering):

  点最少的点覆盖。

点覆盖数(vertex covering number):

  最小点覆盖的点数。

独立集:

  独立集即一个点集,集合中任两个结点不相邻,则称V为独立集。或者说是导出的子图是零图(没有边)的点集。

最大独立集(maximum independent set):

  点最多的独立集。

独立数(independent number):

  最大独立集的点。

若把上面最小点覆盖和最大独立集中的端点数改成点的权值,分别就是最小点权覆盖和最大点权独立集的定义。

然后通过推导,我们可以证明一下公式:(具体证明请看胡伯涛《最小割模型在信息学竞赛中的应用》,这里只考虑应用)

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

最小点权覆盖集=图的最小割值=最大流。

这道题很明显就是求最大点权独立集,所以直接套用公式即可。

建图:如果S与(i+j)%2==0的点相连,(i+j)%2==1的点与T相连,容量为该点的权值。(i+j)%==0与(i+j)%2==1的点相连,容量为无限大。

代码:

  1. #include<stdio.h>
  2. #include<string.h>
  3. #include<iostream>
  4. using namespace std;
  5. const int INF=0x3f3f3f3f;
  6. const int N=;
  7. const int M=N*N;
  8. int h[N],gap[N],head[N];
  9. int cnt,n,m,s,t;
  10. int a[N][N];
  11. struct node
  12. {
  13. int v,c,next;
  14. }e[M];
  15.  
  16. void init()
  17. {
  18. memset(head,-,sizeof(head));
  19. cnt=;
  20. }
  21. void add(int u,int v,int w)
  22. {
  23. e[cnt].v=v,e[cnt].c=w;
  24. e[cnt].next=head[u];head[u]=cnt++;
  25. e[cnt].v=u,e[cnt].c=;
  26. e[cnt].next=head[v];head[v]=cnt++;
  27. }
  28. int dfs(int u,int flow)
  29. {
  30. if(u==t) return flow;
  31. int c=flow,a,i,v,minh=t;
  32. for(i=head[u];i!=-;i=e[i].next)
  33. {
  34. if(e[i].c)
  35. {
  36. v=e[i].v;
  37. if(h[v]==h[u]-)
  38. {
  39. a=min(c,e[i].c);
  40. a=dfs(v,a);
  41. e[i].c-=a;
  42. e[i^].c+=a;
  43. c-=a;
  44. if(h[s]>t) return flow-c;
  45. if(!c) break;
  46. }
  47. minh=min(minh,h[v]);
  48. }
  49. }
  50. if(c==flow)
  51. {
  52. if(--gap[h[u]]==) h[s]=t+;
  53. h[u]=minh+;
  54. ++gap[h[u]];
  55. }
  56. return flow-c;
  57. }
  58. int isap()
  59. {
  60. memset(gap,,sizeof(gap));
  61. memset(h,,sizeof(h));
  62. int ans=;gap[]=t+;
  63. while(h[s]<=t)
  64. ans+=dfs(s,INF);
  65. return ans;
  66. }
  67. int main()
  68. {
  69. int i,j,sum;
  70. while(scanf("%d",&n)!=EOF)
  71. {
  72. sum=;init();s=,t=n*n+;
  73. for(i=;i<=n;i++)
  74. {
  75. for(j=;j<=n;j++)
  76. {
  77. scanf("%d",&a[i][j]);
  78. sum+=a[i][j];
  79. if((i+j)%==)
  80. {
  81. add(s,(i-)*n+j,a[i][j]);
  82. if(i>) add((i-)*n+j,(i-)*n+j,INF);
  83. if(j>) add((i-)*n+j,(i-)*n+j-,INF);
  84. if(i<n) add((i-)*n+j,(i)*n+j,INF);
  85. if(j<n) add((i-)*n+j,(i-)*n+j+,INF);
  86. }
  87. else
  88. add((i-)*n+j,t,a[i][j]);
  89. }
  90. }
  91. printf("%d\n",sum-isap());
  92. }
  93. return ;
  94. }

HDU 1565 最大点权独立集的更多相关文章

  1. hdu 1565&&hdu 1569 (最大点权独立集)

    题目意思很明确就是选一些没有相连的数字,使和最大,建成二分图后求最大点权独立集,, #include<stdio.h> #include<string.h> const int ...

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

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

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

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

  4. hdu 3657最大点权独立集变形(方格取数变形)

    /* 分奇偶为二部图,s与奇建图,t与偶建图,权值为当前数的值,如果遇到必取的权值置为inf. 奇偶建边为相邻的权值为2*(x&y):所有数的值-最小点全覆盖. 置为inf意为不能割掉.奇偶边 ...

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

    http://acm.hdu.edu.cn/showproblem.php?pid=1565 题意: 给你一个n*n的格子的棋盘,每个格子里面有一个非负数. 从中取出若干个数,使得任意的两个数所在的格 ...

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

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

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

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

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

    http://acm.hdu.edu.cn/showproblem.php?pid=1565 题意:中文. 思路:一个棋盘,要使得相邻的点不能同时选,问最大和是多少,这个问题就是最大点权独立集. 可以 ...

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

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

随机推荐

  1. CentOS常用指令

    创建文件: 如touch a.txt 创建文件夹: mkdir -p 文件夹名,当文件夹不存在时候,创建这个文件夹 文件重命名: 把文件text.php得命名为index.php,可以是rename ...

  2. 数据库设计==>>MySchool

    1.数据库设计的步骤 第一步:需求分析(收集信息) 第二步:绘制 E-R 图 (标示实体 ,找到实体的属性 第三步:将 E-R 图转换成数据库模型图 第四步:将数据库模型图转换成数据表 2.如何绘制 ...

  3. 硅谷新闻8--TabLayout替换ViewPagerIndicator

    1.关联库 compile 'com.android.support:design:23.3.0' 2.布局写上TabLayout <android.support.design.widget. ...

  4. Sigleton 单例模式 的简单应用

    需求:一个简单的后台java程序,收集信息,并将信息发送到远端服务器. 实现:实现一个后台线程,实时处理发送过来的信息,并将信息发送到服务器. 技术要点: 1.单例模式 2.队列 并没有实现全部代码, ...

  5. jQuery waterbubble 水球图

    在线实例 默认效果 显示文本 水球半径 文本颜色 边框宽度 设置字体 数据多少 是否显示波纹 水球颜色 是否显示动画 使用方法 <div class="wrap"> & ...

  6. CSS的一些小事

    1.什么时候能将零散的图片整合成一张大图,达到减少请求数的作用? 答:整合进大图的图片是被设置no-repeat用的,如果是repeat-x.repeat-y就不可以. 2.E + F 选择紧贴在E元 ...

  7. .net学习总结

    .NET 学前入门 了解.Net能做什么 了解.NET,C#语言及其特点(分清.NET和C#的关系),对.Net学习有系统全面的认识. C#基础 变量,赋值运算符.数据类型转换等. 选择结构控制(if ...

  8. CSS3选择器(一)

    E[att^='val'] 选择属性值以val开头的任何字符 E[att$='val'] 选择属性值以val结尾的任何字符 E[att*='val'] 选择属性值包含val的任何字符 :root HT ...

  9. javascript中apply()和call()方法的区别

    一.方法的定义 call方法: 语法:call(thisObj,Object)定义:调用一个对象的一个方法,以另一个对象替换当前对象.说明:call 方法可以用来代替另一个对象调用一个方法.call ...

  10. Swift学习--常量.变量.数据类型的使用(一)

    一.Swift中的常量和变量 /* Swift 中定义常量和变量用let/var let 代表定义一个常量 var 代表定义一个变量 Swift 中代表定义常量和变量不需要写数据类型,编译器辉根据我们 ...