【题目链接】 http://www.lydsy.com/JudgeOnline/problem.php?id=1475

【题目大意】

  给出一个n*n的方格,从中取一些不相邻的数字,使得和最大

【题解】

  我们可以根据i+j的奇偶性将点划分为两组,同组之间无连边,因此这是一张二分图
  我们建立源点对偶点引点权大小的流量,建立汇点,从每个奇点引点权大小的流量到汇点,
  总点权减去该图的最小割就是答案,因为最小割中的边表示了该点被选中去除,
  所有去除点和最小,那么剩下的满足限制条件的就一定是最大值了。

【代码】

  1. #include <cstdio>
  2. #include <cstring>
  3. #include <vector>
  4. #include <queue>
  5. using namespace std;
  6. const int INF=0x3f3f3f3f;
  7. const int MAX_V=1000;
  8. struct edge{int to,cap,rev;};
  9. vector<edge> G[MAX_V];
  10. int level[MAX_V],iter[MAX_V];
  11. void add_edge(int from,int to,int cap){
  12. G[from].push_back((edge){to,cap,G[to].size()});
  13. G[to].push_back((edge){from,0,G[from].size()-1});
  14. }
  15. void bfs(int s){
  16. memset(level,-1,sizeof(level));
  17. queue<int> que;
  18. level[s]=0;
  19. que.push(s);
  20. while(!que.empty()){
  21. int v=que.front(); que.pop();
  22. for(int i=0;i<G[v].size();i++){
  23. edge &e=G[v][i];
  24. if(e.cap>0&&level[e.to]<0){
  25. level[e.to]=level[v]+1;
  26. que.push(e.to);
  27. }
  28. }
  29. }
  30. }
  31. int dfs(int v,int t,int f){
  32. if(v==t)return f;
  33. for(int &i=iter[v];i<G[v].size();i++){
  34. edge &e=G[v][i];
  35. if(e.cap>0&&level[v]<level[e.to]){
  36. int d=dfs(e.to,t,min(f,e.cap));
  37. if(d>0){
  38. e.cap-=d;
  39. G[e.to][e.rev].cap+=d;
  40. return d;
  41. }
  42. }
  43. }return 0;
  44. }
  45. int max_flow(int s,int t){
  46. int flow=0;
  47. for(;;){
  48. bfs(s);
  49. if(level[t]<0)return flow;
  50. memset(iter,0,sizeof(iter));
  51. int f;
  52. while((f=dfs(s,t,INF))>0){
  53. flow+=f;
  54. }
  55. }
  56. }
  57. int n,a[30][30];
  58. void solve(){
  59. int sum=0,s=n*n,t=n*n+1;
  60. for(int i=0;i<=t;i++)G[i].clear();
  61. for(int i=0;i<n;i++)for(int j=0;j<n;j++){
  62. if((i+j)%2==0){
  63. if(i+1<n)add_edge(i*n+j,(i+1)*n+j,INF);
  64. if(j+1<n)add_edge(i*n+j,i*n+j+1,INF);
  65. if(i>0)add_edge(i*n+j,(i-1)*n+j,INF);
  66. if(j>0)add_edge(i*n+j,i*n+j-1,INF);
  67. add_edge(s,i*n+j,a[i][j]);
  68. }else add_edge(i*n+j,t,a[i][j]);
  69. sum+=a[i][j];
  70. }printf("%d\n",sum-max_flow(s,t));
  71. }
  72. int main(){
  73. while(~scanf("%d",&n)){
  74. for(int i=0;i<n;i++){
  75. for(int j=0;j<n;j++)scanf("%d",&a[i][j]);
  76. }solve();
  77. }return 0;
  78. }

BZOJ 1475 方格取数(二分图最大点权独立集)的更多相关文章

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

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

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

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

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

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

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

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

  5. TZOJ 3665 方格取数(2)(最大点权独立集)

    描述 给你一个m*n的格子的棋盘,每个格子里面有一个非负数. 从中取出若干个数,使得任意的两个数所在的格子没有公共边,就是说所取数所在的2个格子不能相邻,并且取出的数的和最大. 输入 包括多个测试实例 ...

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

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

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

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

  8. [BZOJ 1475] 方格取数

    [题目链接] https://www.lydsy.com/JudgeOnline/problem.php?id=1475 [算法] 首先将方格黑白染色 , 也就是说 , 如果(i + j)为奇数 , ...

  9. SCU3185 Black and white(二分图最大点权独立集)

    题目大概说有几个黑色.白色矩阵,问能选出黑白不相交的矩形面积和的最大值. 建二分图,黑色矩阵为X部的点,白色为Y部,XY的点权都为其矩阵面积,如果有个黑白矩阵相交则它们之间有一条边,那样问题就是要从这 ...

随机推荐

  1. hdu 1159 Common Subsequence(最长公共子序列 DP)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1159 Common Subsequence Time Limit: 2000/1000 MS (Jav ...

  2. Yii 1.1.17 六、开启路由与使用缓存

    一.开启路由 1.在配置文件main.php的components中 定义如下: // 定义路由 'urlManager'=>array( // URL模式为PATHINFO 'urlForma ...

  3. JAVA常见的集合类

    关系的介绍: Set(集):集合中的元素不按特定方式排序,并且没有重复对象.他的有些实现类能对集合中的对象按特定方式排序. List(列表):集合中的元素按索引位置排序,可以有重复对象,允许按照对象在 ...

  4. 微信小程序宽高适配

    小程序的宽任何机型都是750rpx,但是画布canvas的默认单位是px,可能会出现需要怪异的样式,我们可以用到 wx.getSystemInfoSync().windowWidth和 wx.getS ...

  5. [New learn]GCD的卡死现象分析研究

    https://github.com/xufeng79x/GCDDemo 1.简介 前接[New learn]GCD的基本使用,我们分析了GCD的一般使用方法,其中比较特殊的是在分析到主队列的时候发生 ...

  6. MySQL的数据库引擎的类型(转)

    腾讯后台开发电话面试问到数据库引擎选用的问题,这里补习一下. 本文属于转载,原文链接为:http://www.cnblogs.com/xulb597/archive/2012/05/25/251811 ...

  7. FineReport——插入行策略

    1.空值是默认的选项,即每次插入新行时,格子都是空白的. 2.原值即单元格中原有内容是什么,就复制到新增的格子中,一般适用于单元格是使用公式定义的, 在插入单元格时,公式会保留下来. 3.默认值即通过 ...

  8. 【Hibernate3.3复习知识点二】 - 配置hibernate环境(annotations)

    配置文件hibernate.cfg.xml中引入:<mapping class="com.bjsxt.hibernate.Teacher"/> <hibernat ...

  9. AC日记——妖梦拼木棒 洛谷 P3799

    妖梦拼木棒 思路: 神特么题: 代码: #include <bits/stdc++.h> using namespace std; #define mod 1000000007LL int ...

  10. Django学习过程中的排错总结

    报错一:RuntimeError: You called this URL via POST, but the URL doesn't end in a slash and you have APPE ...