最大点权独立集,参见胡伯涛论文

  1. #include <iostream>
  2. #include <cstring>
  3. #include <cstdio>
  4. #include <queue>
  5. using namespace std;
  6. int m, n, a[105][105], hea[10005], ss, tt, tot, maxFlow, lev[10005], cnt;
  7. const int oo=0x3f3f3f3f;
  8. const int dx[]={0, 1, 0, -1, 0};
  9. const int dy[]={0, 0, 1, 0, -1};
  10. queue<int> d;
  11. struct Edge{
  12. int too, nxt, val;
  13. }edge[100005];
  14. inline int f(int x, int y){
  15. return n*(x-1)+y;
  16. }
  17. void add_edge(int fro, int too, int val){
  18. edge[cnt].nxt = hea[fro];
  19. edge[cnt].too = too;
  20. edge[cnt].val = val;
  21. hea[fro] = cnt++;
  22. }
  23. void addEdge(int fro, int too, int val){
  24. add_edge(fro, too, val);
  25. add_edge(too, fro, 0);
  26. }
  27. bool bfs(){
  28. memset(lev, 0, sizeof(lev));
  29. lev[ss] = 1;
  30. d.push(ss);
  31. while(!d.empty()){
  32. int x=d.front();
  33. d.pop();
  34. for(int i=hea[x]; i!=-1; i=edge[i].nxt){
  35. int t=edge[i].too;
  36. if(!lev[t] && edge[i].val>0){
  37. lev[t] = lev[x] + 1;
  38. d.push(t);
  39. }
  40. }
  41. }
  42. return lev[tt]!=0;
  43. }
  44. int dfs(int x, int lim){
  45. if(x==tt) return lim;
  46. int addFlow=0;
  47. for(int i=hea[x]; i!=-1 && addFlow<lim; i=edge[i].nxt){
  48. int t=edge[i].too;
  49. if(lev[t]==lev[x]+1 && edge[i].val>0){
  50. int tmp=dfs(t, min(lim-addFlow, edge[i].val));
  51. edge[i].val -= tmp;
  52. edge[i^1].val += tmp;
  53. addFlow += tmp;
  54. }
  55. }
  56. return addFlow;
  57. }
  58. void dinic(){
  59. while(bfs()) maxFlow += dfs(ss, oo);
  60. }
  61. int main(){
  62. memset(hea, -1, sizeof(hea));
  63. cin>>m>>n;
  64. ss = 0; tt = m * n + 1;
  65. for(int i=1; i<=m; i++)
  66. for(int j=1; j<=n; j++)
  67. scanf("%d", &a[i][j]);
  68. for(int i=1; i<=m; i++)
  69. for(int j=1; j<=n; j++){
  70. tot += a[i][j];
  71. if((i+j)&1) addEdge(ss, f(i,j), a[i][j]);
  72. else addEdge(f(i,j), tt, a[i][j]);
  73. for(int k=1; k<=4; k++){
  74. int tx=i+dx[k];
  75. int ty=j+dy[k];
  76. if(tx<1 || tx>m || ty<1 || ty>n) continue;
  77. if((i+j)&1) addEdge(f(i,j), f(tx,ty), oo);
  78. else addEdge(f(tx,ty), f(i,j), oo);
  79. }
  80. }
  81. dinic();
  82. cout<<tot-maxFlow<<endl;
  83. return 0;
  84. }

luogu2774 方格取数问题的更多相关文章

  1. luogu2774 方格取数问题 二分图最小权点覆盖集

    题目大意:在一个有 m*n 个方格的棋盘中,每个方格中有一个正整数.现要从方格中取数,使任意 2 个数所在方格没有公共边,输出这些数之和的最大值. 思路:这种各个点之间互相排斥求最大值的题,往往需要利 ...

  2. HDU 1565&1569 方格取数系列(状压DP或者最大流)

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

  3. NOIP200003方格取数

    NOIP200003方格取数 难度级别: D: 编程语言:不限:运行时间限制:1000ms: 运行空间限制:51200KB: 代码长度限制:2000000B 试题描述 XYZ 是首师大附中信息技术团编 ...

  4. vijos 1563 疯狂的方格取数

    P1653疯狂的方格取数 Accepted 标签:天才的talent[显示标签]   背景 Due to the talent of talent123,当talent123做完NOIP考了两次的二取 ...

  5. [HDU 1565+1569] 方格取数

    HDU 1565 方格取数(1) Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others ...

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

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

  7. HDU-1565 方格取数(1)

    http://acm.hdu.edu.cn/showproblem.php?pid=1565 方格取数(1) Time Limit: 10000/5000 MS (Java/Others)    Me ...

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

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

  9. [动态规划]P1004 方格取数

    ---恢复内容开始--- 题目描述 设有N*N的方格图(N<=9),我们将其中的某些方格中填入正整数,而其他的方格中则放 人数字0.如下图所示(见样例): A 0 0 0 0 0 0 0 0 0 ...

随机推荐

  1. IO(字节流、字符流)

      第1章 字节流 在前面的学习过程中,我们一直都是在操作文件或者文件夹,并没有给文件中写任何数据.现在我们就要开始给文件中写数据,或者读取文件中的数据. 1.1 字节输出流OutputStream ...

  2. CF1157D N Problems During K Days

    思路: 在1, 2, 3, ... , k的基础上贪心构造. 实现: #include <bits/stdc++.h> using namespace std; typedef long ...

  3. 《移动Web前端高效开发实战》笔记3--代码检查任务

    在项目的开发过程中,统一的代码风格对于项目的可协作性以及可维护性来说相当重要,因此可以采用一些插件来进行代码风格的检查. 本例中的源文件包含两类:Sass文件和采用ECMAScript 6规范的Jav ...

  4. 关于ECSHOP中sql注入漏洞修复

    标签:ecshop sql注入漏洞修复 公司部署了一个ecshop网站用于做网上商城使用,部署在阿里云服务器上,第二天收到阿里云控制台发来的告警信息,发现ecshop网站目录下文件sql注入漏洞以及程 ...

  5. The great pleasure in life is doing what people say you cannot do.

    The great pleasure in life is doing what people say you cannot do.  人生最大的快乐是做到别人认为你做不到的事情.

  6. webAPP制作框架Ionic--构建APP侧边栏 底部选项卡 轮播图 加载动画

    超好用的移动框架--Ionic Ionic是一个轻量的手机UI库,具有速度快,界面现代化.美观等特点. 为了解决其他一些UI库在手机上运行缓慢的问题,它直接放弃了IOS6和Android4.1以下的版 ...

  7. 【Python图像特征的音乐序列生成】思路的转变

    关于生成网络这边,可能会做一个深度的受限玻尔兹曼机,这样可以保证生成的音乐不会太相似. 情绪识别网络和生成网络的耦合,中间变量可能直接就是一个one-hot向量,用来标注指定的情绪,不做成坐标那种难以 ...

  8. BZOJ 4777: [Usaco2017 Open]Switch Grass

    4777: [Usaco2017 Open]Switch Grass Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 46  Solved: 10[Su ...

  9. Webpack 10分钟入门

    可以说现在但凡开发Single page application,webpack是一个不可或缺的工具. WebPack可以看做是一个模块加工器,如上图所示.它做的事情是,接受一些输入,经过加工产生一些 ...

  10. HDU 5091 Beam Cannon (扫描线思想)

    题意:移动一个矩形,使矩形内包含的点尽量多. 思路:把一个点拆成两个事件,一个进(权值为1)一个出(权值为-1),将所有点按照x排序,然后扫描,对于每个x,用一个滑窗计算一下最大值,再移动扫描线.树状 ...