cogs 734. [网络流24题] 方格取数问题
来源:互联网 发布:安防 人工智能 fpga 编辑:程序博客网 时间:2024/04/29 10:25
- [网络流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
【分析】
好题好题。费用流好题。机智的黑白染色二分图
【代码】
//cogs 734. [网络流24题] 方格取数问题#include<iostream>#include<cstring>#include<cstdio>#include<queue>#define inf 1e9+7#define p(i,j) (i-1)*m+j#define fo(i,j,k) for(i=j;i<=k;i++)using namespace std;queue <int> q;const int mxn=100005;int n,m,cnt,ans,s,t,tot;int head[mxn],dis[mxn];struct node {int to,next,flow;} f[mxn<<2]; inline void add(int u,int v,int flow){ f[++cnt].to=v,f[cnt].next=head[u],f[cnt].flow=flow,head[u]=cnt; f[++cnt].to=u,f[cnt].next=head[v],f[cnt].flow=0,head[v]=cnt;}inline bool bfs(){ int i,j,u,v,flow; memset(dis,-1,sizeof dis); q.push(s); dis[s]=0; while(!q.empty()) { u=q.front(); q.pop(); for(i=head[u];i;i=f[i].next) { v=f[i].to,flow=f[i].flow; if(dis[v]==-1 && flow>0) dis[v]=dis[u]+1,q.push(v); } } if(dis[t]>0) return 1; return 0;}inline int find(int u,int low){ int v,i,j,a=0,sum=0,flow; if(u==t) return low; for(i=head[u];i;i=f[i].next) { v=f[i].to,flow=f[i].flow; if(flow>0 && dis[v]==dis[u]+1 && (a=find(v,min(low-sum,flow)))) { f[i].flow-=a; if(i&1) f[i+1].flow+=a; else f[i-1].flow+=a; sum+=a; } } if(!sum) dis[u]=-1; return sum;}int main(){ freopen("grid.in","r",stdin); freopen("grid.out","w",stdout); int i,j,u,v,x,k1,k2,k3,k4; scanf("%d%d",&n,&m); s=0,t=n*m+1; fo(i,1,n) fo(j,1,m) { int tmp=p(i,j); scanf("%d",&x); tot+=x; if(i+j&1) {add(tmp,t,x);continue;} else add(s,tmp,x); if(i>1) k1=p(i-1,j);else k1=0; if(i<n) k2=p(i+1,j);else k2=0; if(j>1) k3=p(i,j-1);else k3=0; if(j<m) k4=p(i,j+1);else k4=0; if(k1) add(tmp,k1,inf); if(k2) add(tmp,k2,inf); if(k3) add(tmp,k3,inf); if(k4) add(tmp,k4,inf); } while(bfs()) tot-=find(s,inf); printf("%d\n",tot); return 0;}//1 2//1 2
0 0
- cogs 734. [网络流24题] 方格取数问题
- COGS 734. [网络流24题] 方格取数问题
- Cogs 734. [网络流24题] 方格取数问题(最大闭合子图)
- [网络流24题 #9]方格取数问题
- 方格取数问题[网络流24题之9]
- 【网络流24题】方格取数问题
- 网络流24题9. 方格取数问题
- 网络流24题之T9 方格取数问题
- 网络流24题--方格取数问题
- [网络流 24 题] 方格取数问题 骑士共存问题
- HDU 方格取数(网络流24题,八)
- 【codevs1227】[网络流24题]方格取数 2
- 【codevs1907】[网络流24题]方格取数3
- 「网络流 24 题」方格取数
- 「网络流 24 题」方格取数
- 线性规划与网络流24题 09方格取数问题
- 网络流与线性规划24题09方格取数问题
- 线性规划与网络流24题之方格取数问题 二分图点权最大独立集
- EffectiveJava第十章:并发
- 按位于操作(&)的用途
- 学术笔记·我国青年政策的历史变迁与未来方向·九
- 欢迎使用CSDN-markdown编辑器
- 紫书学习——第3章 数组和字符串
- cogs 734. [网络流24题] 方格取数问题
- 内部类(一)
- 【SPA】单页Web应用(一)
- hiho一下 第144周 机会渺茫
- 2017.04.01 愚人的愚人节比赛
- 2017CVTE嵌入式研发岗实习生面经
- 2016蓝桥杯javaA组第5题
- 一个在线学习正则表达式的网站
- pcl离群点删除 方法2