题目背景

none!

题目描述

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

输入输出格式

输入格式:

第 1 行有 2 个正整数 m 和 n,分别表示棋盘的行数和列数。接下来的 m 行,每行有 n 个正整数,表示棋盘方格中的数。

输出格式:

程序运行结束时,将取数的最大总和输出

输入输出样例

输入样例#1:

3 3
1 2 3
3 2 3
2 3 1 

输出样例#1:

11

说明

m,n<=100

Solution:
  网络流套路题。
  一个点若选,会使得其四方向邻格不能被选,若以坐标和的奇偶性为基准,则图会被分为两部分,不难发现同一部分的点是不会互相影响的,这恰好是二分图的形式。
  我们从$s$向所有奇数点连点值大小的边,从偶数点向$t$连点值大小的边,然后从奇数点向受影响的偶数点连inf的边。由于要求的是点值和最大的情况,先要使选的情况合法(即使$s,t$不联通),且不选的点值和最小,那么这不就是最小割嘛!所以只要用点值和-最小割就是答案了。(好套路的黑白点啊)
代码:
/*Code by 520 -- 8.25*/
#include<bits/stdc++.h>
#define il inline
#define ll long long
#define RE register
#define For(i,a,b) for(RE int (i)=(a);(i)<=(b);(i)++)
#define Bor(i,a,b) for(RE int (i)=(b);(i)>=(a);(i)--)
#define debug printf("%d %s\n",__LINE__,__FUNCTION__)
using namespace std;
const int N=100005,inf=233333333,dx[4]={0,0,1,-1},dy[4]={1,-1,0,0};
int n,m,s,t,dis[N],to[N],net[N],w[N],h[N],cnt=1;
int mp[105][105],ans;il int id(int x,int y){return (x-1)*m+y;}il void add(int u,int v,int c){to[++cnt]=v,net[cnt]=h[u],w[cnt]=c,h[u]=cnt;to[++cnt]=u,net[cnt]=h[v],w[cnt]=0,h[v]=cnt;
}queue<int>q;
il bool bfs(){memset(dis,-1,sizeof(dis));q.push(s),dis[s]=0;while(!q.empty()){RE int u=q.front();q.pop();for(RE int i=h[u];i;i=net[i])if(dis[to[i]]==-1&&w[i]) dis[to[i]]=dis[u]+1,q.push(to[i]);}return dis[t]!=-1;
}int dfs(int u,int op){if(u==t)return op;int flow=0,used=0;for(RE int i=h[u];i;i=net[i]){int v=to[i];if(dis[to[i]]==dis[u]+1&&w[i]){used=dfs(to[i],min(op,w[i]));if(!used)continue;flow+=used,op-=used;w[i]-=used,w[i^1]+=used;if(!op)break;}}if(!flow) dis[u]=-1;return flow;
}il void init(){scanf("%d%d",&n,&m),t=n*m+1;For(i,1,n) For(j,1,m) {scanf("%d",&mp[i][j]),ans+=mp[i][j];(i+j)&1?add(s,id(i,j),mp[i][j]):add(id(i,j),t,mp[i][j]);    }For(i,1,n) For(j,1,m)if((i+j)&1) {For(k,0,3){RE int xx=i+dx[k],yy=j+dy[k];if(xx>0&&xx<=n&&yy>0&&yy<=m) add(id(i,j),id(xx,yy),inf);}}while(bfs()) ans-=dfs(s,inf);cout<<ans;
}int main(){init();return 0;
}

转载于:https://www.cnblogs.com/five20/p/9537561.html

P2774 方格取数问题相关推荐

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

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

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

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

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

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

  4. 最小割 ---- 二分图最大独立集(集合冲突模型) ---- 骑士共存 方格取数(网络流24题)

    二分图独立集 定理: 二分图最大独立集=n - 二分图最大匹配 其实二分图独立集是特殊的一种最大权闭合子图.我们根据上文"收益"的思想,把选某个点的收益看为1,左部节点为正权点,右 ...

  5. 【网络流24题】I、 方格取数问题(二分图的最大独立集/最小割)

    I. 方格取数问题(二分图的最大独立集/最小割) [问题分析] 二分图点权最大独立集,转化为最小割模型,从而用最大流解决. [建模方法] 首先把棋盘黑白染色,使相邻格子颜色不同,所有黑色格子看做二分图 ...

  6. hdu2167 方格取数 状态压缩dp

    题意:      方格取数,八个方向的限制. 思路:      八个方向的不能用最大流了,四个的可以,八个的不能抽象成二分图,所以目测只能用dp来跑,dp[i][j]表示的是第i行j状态的最优,具体看 ...

  7. hdu 1565 方格取数(1)(状态压缩dp)

    方格取数(1)                                                                 Time Limit: 10000/5000 MS (J ...

  8. [codevs 1907] 方格取数3

    [codevs 1907] 方格取数3 题解: 二分图染色.最大点权独立集. 因为要用到最大独立集的一些思路,故先写了一篇最大独立集的题解:http://blog.csdn.net/qq_211102 ...

  9. [codevs 1227] 方格取数2

    [codevs 1227] 方格取数 2 题解: 注:这是CODEVS的方格取数2,走k次的版本. 因为每个格子可以走无数次,但走过一次之后数字就变成了0,也就是只有一次可以加上格子里的数字.所以要拆 ...

最新文章

  1. 基于单片机的水壶自动加热系统_基于单片机的智能热水壶设计说明
  2. manual php,PHP - Manual: 介绍 (官方文档)
  3. TCPIP / MTU 和 MSS 的区别和联系
  4. js javascript变量提升
  5. 华为手机怎么隐藏按键图标_华为手机隐藏技巧,一键简单设置,让沟通更加便捷...
  6. 创建Jenkins自动化部署任务
  7. 汽车底盘线控与动力学域控制技术
  8. 推荐装机软件更新下载(2006.11.7更新)
  9. C++ 求指定函数的定积分问题
  10. 什么是cmd?常见的cmd命令 cd、mkdir、md、del、ping
  11. 游戏开发——Gris日志 day01
  12. 手机短信转发到另一个手机接收_我买了个能贴在手机上的显微镜,结果发现了另一个世界...
  13. macOS 系统打开软件时,会出现提示‘ “***.app”已损坏,无法打开。您应该推出磁盘映像。-解决方法
  14. 企立方-拼多多采集注意的点有哪些
  15. vue3+h5实现手写签名
  16. 自动获取系统登录Cookie的浏览器插件
  17. Android Send Email 发送邮件
  18. 【SCons 002】Win10 SCon环境搭建
  19. 微信小程序实战须知2:详解数据API所需网络配置域名、Https、备案、SSL
  20. python输入十个数用冒泡排序_python 冒泡排序法

热门文章

  1. Windows 技术篇-Internet Explorer浏览器启用方法,windows找不到ie浏览器解决办法
  2. PHP 知识点笔记-常用数据类型
  3. 第八周实践项目8 稀疏矩阵的三元组表示的实现及应用
  4. sdut-3102小鑫追女神
  5. 1400协议是什么和28181区别_舞阳钢铁生产30CrMnSiA国军标、国标、舞钢技术协议有什么区别...
  6. 基于MNIST的GANs实现【Pytorch】
  7. 用python做数据分析(行列转换)
  8. gcc: error: CreateProcess: No such file or directory解决方案
  9. 最长回文子序列(LPS)
  10. 分布式服务框架HSF学习