AC日记——[网络流24题]方格取数问题 cogs 734
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的更多相关文章
- Cogs 734. [网络流24题] 方格取数问题(最大闭合子图)
[网络流24题] 方格取数问题 ★★☆ 输入文件:grid.in 输出文件:grid.out 简单对比 时间限制:1 s 内存限制:128 MB «问题描述: 在一个有m*n 个方格的棋盘中,每个方格 ...
- [网络流24题] 方格取数问题/骑士共存问题 (最大流->最大权闭合图)
洛谷传送门 LOJ传送门 和太空飞行计划问题一样,这依然是一道最大权闭合图问题 “骑士共存问题”是“方格取数问题”的弱化版,本题解不再赘述“骑士共存问题”的做法 分析题目,如果我们能把所有方格的数都给 ...
- [网络流24题] 方格取数问题(cogs 734)
«问题描述:在一个有m*n 个方格的棋盘中,每个方格中有一个正整数.现要从方格中取数,使任意2 个数所在方格没有公共边,且取出的数的总和最大.试设计一个满足要求的取数算法.«编程任务:对于给定的方格棋 ...
- luogu2774 [网络流24题]方格取数问题 (最小割)
常见套路:棋盘黑白染色,就变成了一张二分图 然后如果选了黑点,四周的白点就不能选了,也是最小割的套路.先把所有价值加起来,再减掉一个最少的不能选的价值,也就是割掉表示不选 建边(S,黑点i,v[i]) ...
- AC日记——[网络流24题]骑士共存 cogs 746
746. [网络流24题] 骑士共存 ★★☆ 输入文件:knight.in 输出文件:knight.out 简单对比时间限制:1 s 内存限制:128 MB 骑士共存问题 «问题描述: ...
- XTU 二分图和网络流 练习题 C. 方格取数(1)
C. 方格取数(1) Time Limit: 5000ms Memory Limit: 32768KB 64-bit integer IO format: %I64d Java class ...
- [网络流24题] 太空飞行计划(cogs 727)
[问题描述] W 教授正在为国家航天中心计划一系列的太空飞行.每次太空飞行可进行一系列商业性实验而获取利润.现已确定了一个可供选择的实验集合E={E1,E2,-,Em},和进行这些实验需要使用的全部仪 ...
- LibreOJ #6007. 「网络流 24 题」方格取数 最小割 最大点权独立集 最大流
#6007. 「网络流 24 题」方格取数 内存限制:256 MiB时间限制:1000 ms标准输入输出 题目类型:传统评测方式:文本比较 上传者: 匿名 提交提交记录统计讨论测试数据 题目描述 ...
- Libre 6007 「网络流 24 题」方格取数 / Luogu 2774 方格取数问题 (网络流,最大流)
Libre 6007 「网络流 24 题」方格取数 / Luogu 2774 方格取数问题 (网络流,最大流) Description 在一个有 m*n 个方格的棋盘中,每个方格中有一个正整数.现要从 ...
随机推荐
- Python 入门基础
第一章 计算机基础 1.1 硬件 CPU:处理和运算 内存:临时存储数据 硬盘:永久存储系统 操作系统:是一个软件(特殊), 调度每个硬件之间的数据传输 1.2 操作系统 Windows:xp/7/8 ...
- bootstrap历练实例: 基本胶囊式的导航菜单
<!DOCTYPE html><html><head><meta http-equiv="Content-Type" content=&q ...
- Bootstrap历练实例:链接样式按钮
<!DOCTYPE html><html><head> <meta http-equiv="Content-Type" content=& ...
- shell脚本,文件里面的英文大小写替换方法。
[root@localhost wyb]# cat daxiaoxie qweBNMacb eeeDFSmkl svdIOPtyu [root@localhost wyb]# cat daxiaoxi ...
- div section article区分--20150227
div section article ,语义是从无到有,逐渐增强的.div 无任何语义,仅仅用作样式化或者脚本化的钩子(hook),对于一段主题性的内容,则就适用 section,而假如这段内容可以 ...
- (56)zabbix Screens视图配置
screen翻译成中文为“屏幕”,在超市.单位等等地方都比较常见到监控视频,视频上有多块小视频,实际上zabbix screen和这个功能类似.你可以设置多个screen,每个screen可以显示特定 ...
- UNIX环境C语言进程通信
一.信号管理 1.函数signal signal函数是UNIX系统信号机制最简单的接口 #include <signal.h> typedef void (*sighandler_t)(i ...
- Linux三剑客之sed详解(2)
一.sed 分组替换(),\1 实例:I am a oldboy teacher. 吧oldboy 提取出来 二.特殊符号&代表被替换的字符串 实例:批量替换文件名 把stu_102999_1 ...
- centos7.2快速搭建LAMP平台
#查看linux系统版本信息 cat /etc/redhat-release 以上是操作系统的所有信息,补充下内核信息参数介绍: 3.10.0-514.26.2.el7.x86_64 3表示主版本号, ...
- auth认证组件
Django自带的用户认证 我们在开发一个网站的时候,无可避免的需要设计实现网站的用户系统.此时我们需要实现包括用户注册.用户登录.用户认证.注销.修改密码等功能,这还真是个麻烦的事情呢. Djang ...