首先,我们要读懂这道题,否则你会和我一开始产生一样的疑问,把所有的数都取走剩下一个最小的不就可以了么???然后我们发现样例完全不是这么回事。题目中所说的使相邻的两个数没有公共边,是指你去走的数,也就是取完之后矩阵里的空白格子。明白了这一点,我们可能会有一个比较基础的贪心思想,没错,就是隔一个取一个,但是这么做并不可行,具体反例很容易找。然后我们通过观察,发现这道题和某最大权闭合子图有些类似,如果我们全取所有点,删去最小割说不准可行。
开始考虑建图,首先所有的奇数格子连源点,偶数格子连汇点,边权为点权。他们之间的边只连奇数到偶数的,边权为inf,这么连是为了避免重复计算。然后直接DINIC最大流就可以了。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<queue>
#define ll long long
#define inf 50000000
#define re register
#define id m*(i-1)+j
using namespace std;
struct po
{int from,to,dis,nxt;
}edge[1000001];
int head[1000001],cur[1000001],dep[60001],n,m,s,t,u,num=-1,x,y,l,tot,sum,d;
int nm,a[120][120];
int dx[5]={0,1,0,-1,0};
int dy[5]={0,0,1,0,-1};
inline int read()
{int x=0,c=1;char ch=' ';while((ch>'9'||ch<'0')&&ch!='-')ch=getchar();while(ch=='-')c*=-1,ch=getchar();while(ch<='9'&&ch>='0')x=x*10+ch-'0',ch=getchar();return x*c;
}
inline void add_edge(int from,int to,int dis)
{edge[++num].nxt=head[from];edge[num].from=from;edge[num].to=to;edge[num].dis=dis;head[from]=num;
}
inline void add(int from,int to,int dis)
{add_edge(from,to,dis);add_edge(to,from,0);
}
inline bool bfs()
{memset(dep,0,sizeof(dep));queue<int> q;while(!q.empty())q.pop();dep[s]=1;q.push(s);while(!q.empty()){int now=q.front();q.pop();for(re int i=head[now];i!=-1;i=edge[i].nxt){int v=edge[i].to;if(dep[v]==0&&edge[i].dis>0){dep[v]=dep[now]+1;if(v==t)return 1;q.push(v); }}}return 0;
}
inline int dfs(int u,int dis)
{if(u==t)return dis;int diss=0;for(re int i=head[u];i!=-1;i=edge[i].nxt){int v=edge[i].to;if(dep[v]==dep[u]+1&&edge[i].dis!=0){int check=dfs(v,min(dis,edge[i].dis));if(check>0){diss+=check;dis-=check;edge[i].dis-=check;edge[i^1].dis+=check;if(dis==0) break;}}}return diss;
}
inline int dinic()
{int ans=0;while(bfs()){for(re int i=0;i<=t;i++)cur[i]=head[i];while(int d=dfs(s,inf))ans+=d;}return ans;
}
int main()
{memset(head,-1,sizeof(head));n=read();m=read();s=0;t=n*m+1;for(re int i=1;i<=n;i++)for(re int j=1;j<=m;j++)a[i][j]=read(),sum+=a[i][j];for(re int i=1;i<=n;i++)for(re int j=1;j<=m;j++){if((i+j)%2==0)add(s,id,a[i][j]);elseadd(id,t,a[i][j]);for(re int h=1;h<=4;h++){int lx=i+dx[h],ly=j+dy[h];if(lx>=1&&lx<=n&&ly>=1&&ly<=m)if((lx+ly)%2!=0)add(id,(lx-1)*m+ly,inf);}}cout<<sum-dinic();
}

转载于:https://www.cnblogs.com/victorique/p/8426683.html

【P2774】方格取数问题(贪心+最大流,洛谷)相关推荐

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

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

  2. 网络流建模方法(四)—— 互不攻击问题 洛谷 P3353 骑士共存问题 (附 洛谷 P2774 方格取数问题)

    网络流建模方法(四)互不攻击问题,或者说是共存问题, 这类题目看起来有点像二分图匹配,这类题目我们就是建一个二分图然后跑最大流 还是先说题目洛谷P3353 题目描述 在一个 nn个方格的国际象棋棋盘上 ...

  3. 洛谷 - P2774 方格取数问题(最小割-最大流+奇偶拆点)

    题目链接:点击查看 题目大意:给出一个n*m的棋盘,每个位置都有一个正整数,现在要从方格中取数,要求任意两个数在方格中的位置不相邻,求取出的数的最大和 题目分析:正难则反,在这个题目中正着建图比较难, ...

  4. 【codevs1227】方格取数2(最大流费最大流-模板

    problem 给出一个n*n的矩阵,每一格有一个非负整数A[i][j],(Aij <= 1000) 现在从(1,1)出发,可以往右或者往下走,最后到达(n,n) 每达到一格,把该格子的数取出来 ...

  5. P2774 方格取数问题

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

  6. 【CODEVS1227】方格取数2(费用流)

    题目描述 传送门 题解 每个点拆两个,可以看做入点和出点.从入点向出点需要连两条边,一条容量为1,费用为val,另一条容量为INF,费用为0:这里是为了表示每一个点可以经过无数次,但是val只可以取一 ...

  7. 【codevs1227】方格取数2,费用流

    传送门 写在前面:努力提升写网络流的能力 思路:建图和蚯蚓很相似,不过这里(i,j)拆出的两个点x,y之间的边有花费,实际点(i,j)与(i+1,j),(i,j)与(i,j+1)之间的连边要流量inf ...

  8. HDU-1569 方格取数(2) 最小割最大流

    题义很简单,还记得方格取数(1)的时候,使用状态压缩写的,这里由于行列数太大,因此无法进行压缩.所以要运用的最小割最大流的思想来解这道题. 大概是这样分析的,题义是要我们求在一个方格内取出N个点,使得 ...

  9. 734. [网络流24题] 方格取数问题 二分图点权最大独立集/最小割/最大流

    «问题描述: 在一个有m*n 个方格的棋盘中,每个方格中有一个正整数.现要从方格中取数,使任 意2 个数所在方格没有公共边,且取出的数的总和最大.试设计一个满足要求的取数算法. «编程任务: 对于给定 ...

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

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

最新文章

  1. js空对象undefined测试
  2. python使用requests+xpath爬取小说并下载
  3. python ‘%r‘或者‘{!r}‘的意思
  4. MVC全局用户验证之HttpModule
  5. 如何从Windows远程上传文件到Linux(例如CentOS 7)
  6. PyCairo 中的形状和填充
  7. 链表题目---3 合并两个有序单链表 和 分割链表
  8. (七)深入浅出TCPIP之深入浅出TCPIP之TCP重传机制
  9. 人工智能时代来临,还需要那么多人吗?
  10. ABP之Javascript生成
  11. cocos2d-x新手学习之Helloworld(第三篇)[版本号:cocos2d-x-3.1.1]
  12. 中学数字化实验室建设及配置要求
  13. 网易云android国内版,网易云音乐Android版产品体验报告
  14. python爬虫qq付费音乐_Python爬虫实战之爬取QQ音乐数据!QQ音乐限制太多了
  15. CVE-2020-1938 /CNVD-2020-10487漏洞调试
  16. amd一键超频怎么用_AMD Ryzen小白说明书——CPU超频篇
  17. wifi又被隔壁老王蹭了,这样设置路由器,老王再也蹭不了你的wifi了……路由器设置实用教程基础篇
  18. Android 代码形式安装证书到手机内
  19. E. MEX and Increments---dp+优先队列+贪心
  20. java sha256加密_如何用Sha256进行简单的加密或者解密

热门文章

  1. vuex分模块后,如何获取state的值
  2. BZOJ 2429: [HAOI2006]聪明的猴子【最小生成树】
  3. POJ 3320 尺取法,Hash,map标记
  4. SQL--数据库性能优化详解
  5. [VS2010]在C#工程中设置Reference的相对路径
  6. OpenCV的示例程序在哪里?
  7. 软件工程硕士和计算机硕士论文题目,计算机硕士毕业论文答辩自述
  8. vsftp中配置默认目录
  9. leetcode算法题--多米诺与托米诺平铺★
  10. leetcode算法题--最佳买卖股票时机含冷冻期★