734. [网络流24题] 方格取数问题

★★☆   输入文件:grid.in   输出文件:grid.out   简单对比
时间限制:1 s   内存限制:128 MB

«问题描述:
在一个有m*n 个方格的棋盘中,每个方格中有一个正整数。现要从方格中取数,使任
意2 个数所在方格没有公共边,且取出的数的总和最大。试设计一个满足要求的取数算法。
«编程任务:
对于给定的方格棋盘,按照取数要求编程找出总和最大的数。
«数据输入:
由文件grid.in提供输入数据。文件第1 行有2 个正整数m和n,分别表示棋盘的行数
和列数。接下来的m行,每行有n个正整数,表示棋盘方格中的数。
«结果输出:
程序运行结束时,将取数的最大总和输出到文件grid.out中。
输入文件示例 输出文件示例
grid.in
3 3
  1 2 3

3 2 3

2 3 1

grid.out

11

(1<=N,M<=30)

思路:

  取数;

  取出的数满足任意两两坐标不相邻;

  所以,我们把点标记;

  把全部的点都用bfs标记成true或者false;

  true与true不相邻,false与false不相邻;

  然后标记为true的点在集合a;

  标记为false的点在集合b;

  建立超级源点s和超级汇点t;

  s向a的每个点连边,流量为点的权值;

  t向b的每个点连边,流量为点的权值;

  然后,a中与b相邻的点连边,流量无限大;

  然后求出最小割;

  最后的ans等于所有点权值的总和减去最小割;

来,上代码:

#include <queue>
#include <cstdio>
#include <iostream> using namespace std; struct ColorNode {
int x,y;
bool color;
}; struct EdgeType {
int v,f,e;
};
struct EdgeType edge[]; const int dx[]={,-,,,};
const int dy[]={,,,,-}; int n,m,dis[][],ans,head[],s=,t;
int cnt=,deep[]; bool if_[][]; char Cget; inline void in(int &now)
{
now=,Cget=getchar();
while(Cget>''||Cget<'') Cget=getchar();
while(Cget>=''&&Cget<='')
{
now=now*+Cget-'';
Cget=getchar();
}
} struct ColorNode node(int x,int y,int color)
{
struct ColorNode pos;
pos.x=x,pos.y=y,pos.color=color;
return pos;
} inline void edge_add(int u,int v,int f)
{
edge[++cnt].v=v,edge[cnt].f=f,edge[cnt].e=head[u],head[u]=cnt;
edge[++cnt].v=u,edge[cnt].f=,edge[cnt].e=head[v],head[v]=cnt;
} bool BFS()
{
queue<int>que;
for(int i=s;i<=t;i++) deep[i]=-;
deep[s]=;que.push(s);
while(!que.empty())
{
int pos=que.front();que.pop();
for(int i=head[pos];i;i=edge[i].e)
{
if(deep[edge[i].v]<&&edge[i].f>)
{
deep[edge[i].v]=deep[pos]+;
if(edge[i].v==t) return true;
que.push(edge[i].v);
}
}
}
return false;
} int flowing(int now,int flow)
{
if(now==t||flow<=) return flow;
int oldflow=;
for(int i=head[now];i;i=edge[i].e)
{
if(edge[i].f<=||deep[edge[i].v]!=deep[now]+) continue;
int pos=flowing(edge[i].v,min(edge[i].f,flow));
flow-=pos;
oldflow+=pos;
edge[i].f-=pos;
edge[i^].f+=pos;
if(flow==) return oldflow;
}
return oldflow;
} int main()
{
freopen("grid.in","r",stdin);
freopen("grid.out","w",stdout);
in(n),in(m);t=n*m+;
for(int i=;i<=n;i++)
{
for(int j=;j<=m;j++)
{
in(dis[i][j]);
ans+=dis[i][j];
}
}
queue<ColorNode>que;
if_[][]=true;
que.push(node(,,if_[][]));
while(!que.empty())
{
struct ColorNode pos=que.front();que.pop();
if(pos.color)
{
edge_add(s,(pos.x-)*m+pos.y,dis[pos.x][pos.y]);
int x=pos.x,y=pos.y,hash=(pos.x-)*m+pos.y;
for(int i=;i<=;i++)
{
if(x+dx[i]>&&x+dx[i]<=n&&y+dy[i]>&&y+dy[i]<=m)
{
edge_add(hash,(pos.x+dx[i]-)*m+pos.y+dy[i],0x7ffffff);
}
}
}
else edge_add((pos.x-)*m+pos.y,t,dis[pos.x][pos.y]);
if(pos.x+<=n&&!if_[pos.x+][pos.y])
{
que.push(node(pos.x+,pos.y,!pos.color));
if_[pos.x+][pos.y]=true;
}
if(pos.y+<=m&&!if_[pos.x][pos.y+])
{
if_[pos.x][pos.y+]=true;
que.push(node(pos.x,pos.y+,!pos.color));
}
}
while(BFS()) ans-=flowing(s,0x7ffffff);
cout<<ans;
return ;
}

AC日记——[网络流24题]方格取数问题 cogs 734的更多相关文章

  1. Cogs 734. [网络流24题] 方格取数问题(最大闭合子图)

    [网络流24题] 方格取数问题 ★★☆ 输入文件:grid.in 输出文件:grid.out 简单对比 时间限制:1 s 内存限制:128 MB «问题描述: 在一个有m*n 个方格的棋盘中,每个方格 ...

  2. [网络流24题] 方格取数问题/骑士共存问题 (最大流->最大权闭合图)

    洛谷传送门 LOJ传送门 和太空飞行计划问题一样,这依然是一道最大权闭合图问题 “骑士共存问题”是“方格取数问题”的弱化版,本题解不再赘述“骑士共存问题”的做法 分析题目,如果我们能把所有方格的数都给 ...

  3. [网络流24题] 方格取数问题(cogs 734)

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

  4. luogu2774 [网络流24题]方格取数问题 (最小割)

    常见套路:棋盘黑白染色,就变成了一张二分图 然后如果选了黑点,四周的白点就不能选了,也是最小割的套路.先把所有价值加起来,再减掉一个最少的不能选的价值,也就是割掉表示不选 建边(S,黑点i,v[i]) ...

  5. AC日记——[网络流24题]骑士共存 cogs 746

    746. [网络流24题] 骑士共存 ★★☆   输入文件:knight.in   输出文件:knight.out   简单对比时间限制:1 s   内存限制:128 MB 骑士共存问题 «问题描述: ...

  6. XTU 二分图和网络流 练习题 C. 方格取数(1)

    C. 方格取数(1) Time Limit: 5000ms Memory Limit: 32768KB 64-bit integer IO format: %I64d      Java class ...

  7. [网络流24题] 太空飞行计划(cogs 727)

    [问题描述] W 教授正在为国家航天中心计划一系列的太空飞行.每次太空飞行可进行一系列商业性实验而获取利润.现已确定了一个可供选择的实验集合E={E1,E2,-,Em},和进行这些实验需要使用的全部仪 ...

  8. LibreOJ #6007. 「网络流 24 题」方格取数 最小割 最大点权独立集 最大流

    #6007. 「网络流 24 题」方格取数 内存限制:256 MiB时间限制:1000 ms标准输入输出 题目类型:传统评测方式:文本比较 上传者: 匿名 提交提交记录统计讨论测试数据   题目描述 ...

  9. Libre 6007 「网络流 24 题」方格取数 / Luogu 2774 方格取数问题 (网络流,最大流)

    Libre 6007 「网络流 24 题」方格取数 / Luogu 2774 方格取数问题 (网络流,最大流) Description 在一个有 m*n 个方格的棋盘中,每个方格中有一个正整数.现要从 ...

随机推荐

  1. 新版raspbian系统的固定IP配置和启用root账户的ssh登录功能的方法

    1. 2016新版raspbian系统的固定IP配置: 自2016年2月份新版raspbian系统发布以后,树莓派的固定IP配置方法就与之前不一样了. 之前在raspbian系统中编辑/etc/net ...

  2. ios 序列化

    1到底这个序列化有啥作用? 面向对象的程序在运行的时候会创建一个复杂的对象图,经常要以二进制的方法序列化这个对象图,这个过程叫做Archiving. 二进制流可以通过网络或写入文件中(来源于某教材的一 ...

  3. 【译】Swift 字符串速查表

    [译]Swift 字符串速查表 2015-12-18 10:32 编辑: suiling 分类:Swift 来源:CocoaChina翻译活动 10 5585 Swift字符串 招聘信息: iOS高级 ...

  4. C++系统学习一:基本数据类型和变量

    程序语言 程序语言最基本的特征 整型.字符型等内置类型 变量,用来为对象命名 表达式和语句,操纵上述数据类型的具体值 if等控制结构 函数,定义可供随时调用的计算单元 程序语言的扩展 自定义数据类型 ...

  5. phpstorm设置方法头信息备注

    一.目标,如下图,希望在方法上增加如下头信息备注 二.设置live template: 三.增加方法头信息备注,如下所示: * created by ${USER} at ${DATE} ${TIME ...

  6. GIMP模版的制作

    GIMP自定模版,方便自己作图 新建模版: 设置开机自动加载模版:

  7. python3.x 多路IO复用补充asyncio

    asyncio模块是python之父写的模块,按说应该是靠谱的,python3.6版本定义为稳定版本. 说明书:https://docs.python.org/3/library/asyncio.ht ...

  8. ST3使用

    创建新的构建系统 Tools -> Build System -> New Build System... 输入类似的构建指令(首先清除当前的运行程序后再重新运行): { "sh ...

  9. Python的第3堂课

    20181119笔记 一.内存管理相关 ①Cpython解释器的垃圾回收机制 什么是垃圾:当一个值没有被绑定任何变量名(即该值的引用计数为零时),该值就是垃圾. 垃圾回收是收回值占用的内存空间. 引用 ...

  10. (原)UICollectionView的基本使用

    UICollectionView基本使用 学习iOS一段时间了,早听说了UICollectionView的强大一直没有机会使用,今天自己研究了一下. UICollectonView类似UITableV ...