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 个方格的棋盘中,每个方格中有一个正整数.现要从 ...
随机推荐
- EMVS: Event-based Multi-View Stereo 阅读笔记
0. 摘要 EMVS目的:从已知轨迹的event相机,估计半稠密的3D结构 传统的MVS算法目的:从已知视点的图片集,去估计场景的稠密3D结构. EMVS2个固有属性: (1) 当传感器发生相对运 ...
- jquery 获得某一组name的id并合并
var attachmentids = $("input[name='attachmentid']").map(function(){return $(this).val()}). ...
- javaEE(14)_文件上传下载
一.文件上传概述 1.实现web开发中的文件上传功能,需完成如下二步操作: •在web页面中添加上传输入项•在servlet中读取上传文件的数据,并保存到本地硬盘中. 2.如何在web页面中添加上传输 ...
- Sql语句的一些事(一)
(1)LIMIT子句(MySql) ----LIMIT 子句用于规定要返回的记录的数目,一般和Order By一起使用 经常用于数据的分页查询,但是一旦数据量一大,limit的性能就会急速下降 格式: ...
- (26)zabbix脚本报警介质自定义(钉钉)
zabbix机器人告警配置 首先在钉钉中创建一个群然后设置群机器人添加自定义机器人(webhook...) 添加后复制其中的webhook地址到报警脚本dingding.py中的webhook=... ...
- Linux运维发展与学习路线图
记录一下Linux所要懂的知识体系,方便未来学习的时候自我验证. Linux运维课程体系大纲: Linux入门 了解Linux基础,知道什么是Linux,会安装Linux,使用相关基础命令,如:cd, ...
- GIMP模板选区操作
选择方法有很多种,这里我就新学的方法记录一下,主要是通过小剪刀和Toggle Quick Mask 相结合的运用. 选择Scissors Select Tool工具 设置基本的属性:Antialisa ...
- hosts设置本地虚拟域名
C:\Windows\System32\drivers\etc hosts 需要用管理员运行
- day21-python模块
1.时间 import time #时间戳 #计算 # print(time.time()) #1481321748.481654秒 #结构化时间---当地时间 # print(time.localt ...
- PAT Basic 1068
1068 万绿丛中一点红 对于计算机而言,颜色不过是像素点对应的一个 24 位的数值.现给定一幅分辨率为 M×N 的画,要求你找出万绿丛中的一点红,即有独一无二颜色的那个像素点,并且该点的颜色与其周围 ...