P2774 方格取数问题

emm........仔细一看,这不是最大权闭合子图的题吗!

取一个点$(x,y)$,限制条件是同时取$(x,y+1),(x,y-1),(x+1,y),(x-1,y)$,只不过权值取负而已

于是我们把图分为黑点和白点,同颜色点之间不相邻,不同颜色的点相邻(如将$(x+y)%2==1$的点记为黑点)

假装把白点的权值都看成负的

记$link(p,q,val)$为$p$向$q$连一条$val$的边(包括反向边)

蓝后根据最大权闭合子图的套路

对于黑点$p$与相邻的白点$q$

$link(S,p,val_p)$

$link(p,q,inf)$

$link(q,T,val_q)$($val_q$不取负

蓝后就可以愉快地跑最小割辣

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstring>
  4. #include<queue>
  5. using namespace std;
  6. #define N 100005
  7. #define inf 1000000000
  8. const int d1[]={,,-,};
  9. const int d2[]={,,,-};
  10. int n,m,d[N],cur[N],tot,S,T; bool vis[N];
  11. queue <int> h;
  12. int cnt=,hd[N],nxt[N],ed[N],poi[N],val[N];
  13. inline void adde(int x,int y,int v){
  14. nxt[ed[x]]=++cnt, hd[x]=hd[x]?hd[x]:cnt,
  15. ed[x]=cnt, poi[cnt]=y, val[cnt]=v;
  16. }
  17. inline void link(int x,int y,int v){adde(x,y,v),adde(y,x,);}
  18. inline int id(int x,int y){return (x-)*m+y;}
  19. bool bfs(){
  20. memset(vis,,sizeof(vis));
  21. h.push(S); vis[S]=;
  22. while(!h.empty()){
  23. int x=h.front(); h.pop();
  24. for(int i=hd[x];i;i=nxt[i]){
  25. int to=poi[i];
  26. if(!vis[to]&&val[i]>)
  27. vis[to]=,d[to]=d[x]+,h.push(to);
  28. }
  29. }return vis[T];
  30. }
  31. int dfs(int x,int a){
  32. if(x==T||a==) return a;
  33. int F=,f;
  34. for(int &i=cur[x];i;i=nxt[i]){
  35. int to=poi[i];
  36. if(d[to]==d[x]+&&(f=dfs(to,min(a,val[i])))>)
  37. a-=f,F+=f,val[i]-=f,val[i^]+=f;
  38. if(!a) break;
  39. }return F;
  40. }
  41. int dinic(){
  42. int re=;
  43. while(bfs()){
  44. for(int i=;i<=T;++i) cur[i]=hd[i];
  45. re+=dfs(S,inf);
  46. }return re;
  47. }
  48. void draw(int x,int y){
  49. int p=id(x,y),w;
  50. scanf("%d",&w); tot+=w;
  51. if((x+y)&){//不要重复连边
  52. link(S,p,w);
  53. for(int i=;i<;++i){
  54. int r1=x+d1[i],r2=y+d2[i];
  55. if(r1>&&r1<=n&&r2>&&r2<=m)
  56. link(p,id(r1,r2),inf);
  57. }
  58. }else link(p,T,w);
  59. }
  60. int main(){
  61. scanf("%d%d",&n,&m);
  62. S=n*m+; T=S+;
  63. for(int i=;i<=n;++i)
  64. for(int j=;j<=m;++j)
  65. draw(i,j);
  66. printf("%d",tot-dinic());
  67. return ;
  68. }

P2774 方格取数问题(网络流)的更多相关文章

  1. P2774 方格取数问题 网络流重温

    P2774 方格取数问题 这个题目之前写过一次,现在重温还是感觉有点难,可能之前没有理解透彻. 这个题目要求取一定数量的数,并且这些数在方格里面不能相邻,问取完数之后和最大是多少. 这个很好的用了网络 ...

  2. P2774 方格取数问题 网络流

    题目: P2774 方格取数问题 题目背景 none! 题目描述 在一个有 m*n 个方格的棋盘中,每个方格中有一个正整数.现要从方格中取数,使任意 2 个数所在方格没有公共边,且取出的数的总和最大. ...

  3. P2774 方格取数问题(最小割)

    P2774 方格取数问题 一看题目便知是网络流,但由于无法建图.... 题目直说禁止那些条件,这导致我们直接建图做不到,既然如此,我们这是就要逆向思维,他禁止那些边,我们就连那些边. 我们将棋盘染色, ...

  4. 洛谷 P2774 方格取数问题 解题报告

    P2774 方格取数问题 题目背景 none! 题目描述 在一个有 \(m*n\) 个方格的棋盘中,每个方格中有一个正整数.现要从方格中取数,使任意 2 个数所在方格没有公共边,且取出的数的总和最大. ...

  5. P2774 方格取数问题 网络最大流 割

    P2774 方格取数问题:https://www.luogu.org/problemnew/show/P2774 题意: 给定一个矩阵,取出不相邻的数字,使得数字的和最大. 思路: 可以把方格分成两个 ...

  6. P2774 方格取数(网络流)

    https://www.luogu.com.cn/problem/P2774 在一个有 m×n 个方格的棋盘中,每个方格中有一个正整数. 现要从方格中取数,使任意2个数所在方格没有公共边,且取出的数的 ...

  7. P2774 方格取数问题

    题目背景 none! 题目描述 在一个有 m*n 个方格的棋盘中,每个方格中有一个正整数.现要从方格中取数,使任意 2 个数所在方格没有公共边,且取出的数的总和最大.试设计一个满足要求的取数算法.对于 ...

  8. CODEVS_1227 方格取数2 网络流 最小费用流 拆点

    原题链接:http://codevs.cn/problem/1227/ 题目描述 Description 给出一个n*n的矩阵,每一格有一个非负整数Aij,(Aij <= 1000)现在从(1, ...

  9. [洛谷P2774]方格取数问题

    题目大意:给你一个$n\times m$的方格,要求你从中选择一些数,其中没有相邻两个数,使得最后和最大 题解:网络流,最小割,发现相邻的两个点不可以同时选择,进行黑白染色,原点向黑点连一条容量为点权 ...

随机推荐

  1. 嵌入式linux内存越界定位和解决 (转)

    https://blog.csdn.net/meejoy/article/details/41729585 https://blog.csdn.net/killmice/article/details ...

  2. 工作流JBPM

    jbpm3 共分为12种节点 1.node节点:如果该节点没有定义ACTION,则流转到该节点时不会停留,会继续往下走,如果定义ACTION,执行完ACTION后会停在该节点上,调用 token.si ...

  3. 修改了my.ini没有效果,MySql的字符集还是没有变成utf8——mysql中文乱码

    https://www.jianshu.com/p/554b9575c5da Windows下修改MySql 5.6的字符集,根据网上提供的方法.就是修改my.ini配置文件,然后增加几个字段就可以了 ...

  4. Servlet学习1

    1.首先在Tomcat的webapp目录下新建文件夹myWebapp,作为自己的web应用. 2.myWebapp下新建WEB-INF(必须这个名)目录,WEB-INF下新建classes目录放置se ...

  5. mysql5安装

    一.MYSQL的安装 1.打开下载的mysql安装文件mysql-5.0.27-win32.zip,双击解压缩,运行“setup.exe”. 2.选择安装类型,有“Typical(默认)”.“Comp ...

  6. 2018-2019-2 网络对抗技术 20165321 Exp6 信息搜集与漏洞扫描

    1.实践目标 掌握信息搜集的最基础技能与常用工具的使用方法. 2.实践内容 (1)各种搜索技巧的应用 百度查找IP地址: 查了一下kali的IP地址 https://fofa.so/的使用: 查询了一 ...

  7. .NET中结构和类的区别

    最近在学习Swift语言,看到了枚举这一章,Swift可以支持在枚举中定义方法...于是想到了回顾一下.NET中枚举.结构.类之间区别. 枚举在.NET较为简单,这里就不作比较,只谈谈结构和类. 1. ...

  8. mysql优化:explain分析sql语句执行效率

    Explain命令在解决数据库性能上是第一推荐使用命令,大部分的性能问题可以通过此命令来简单的解决,Explain可以用来查看SQL语句的执行效 果,可以帮助选择更好的索引和优化查询语句,写出更好的优 ...

  9. C# 使用Newtonsoft.Json读写Json文件

    { "CAN": false, "AccCode": 4294901856, "Id": 768, "BPointMove&quo ...

  10. C# 数组在内存中的存储

    C# 数组是引用类型,那么在内存中是如何存储的呢? 在VS中调试C#程序,如何查看内存.寄存器.反汇编 在这篇文章里看到了如何在VS 中查看内存 先断点打在数组创建后语句那里,点debug->W ...