[网络流24题]方格取数问题
2018-01-08 20:28
351 查看
方格取数问题
题目描述
在一个有 m*n 个方格的棋盘中,每个方格中有一个正整数。现要从方格中取数,使任意 2 个数所在方格没有公共边,且取出的数的总和最大。试设计一个满足要求的取数算法。对于给定的方格棋盘,按照取数要求编程找出总和最大的数。
输入格式:
第 1 行有 2 个正整数 m 和 n,分别表示棋盘的行数和列数。接下来的 m 行,每行有 n 个正整数,表示棋盘方格中的数。
输出格式:
程序运行结束时,将取数的最大总和输出
输入样例#1:
3 31 2 33 2 32 3 1
输出样例#1:
11
说明
m,n<=100
题解:
二分图最大点独立子集模型,在相邻的2点之间连边,最后答案总的减去最小割
代码:
题目描述
在一个有 m*n 个方格的棋盘中,每个方格中有一个正整数。现要从方格中取数,使任意 2 个数所在方格没有公共边,且取出的数的总和最大。试设计一个满足要求的取数算法。对于给定的方格棋盘,按照取数要求编程找出总和最大的数。
输入格式:
第 1 行有 2 个正整数 m 和 n,分别表示棋盘的行数和列数。接下来的 m 行,每行有 n 个正整数,表示棋盘方格中的数。
输出格式:
程序运行结束时,将取数的最大总和输出
输入样例#1:
3 31 2 33 2 32 3 1
输出样例#1:
11
说明
m,n<=100
题解:
二分图最大点独立子集模型,在相邻的2点之间连边,最后答案总的减去最小割
代码:
#include<bits/stdc++.h> using namespace std; const int max_n = 2001; const int max_m = 260010; const int inf = 1e9+7; int point[max_n],nxt[max_m],v[max_m],remain[max_m]; int deep[max_n],a[max_n][max_n]; int n,m,tot,s,t,num; inline void init() { memset(point,-1,sizeof(point)); memset(nxt,-1,sizeof(nxt)); tot=-1; s=0; t=max_n-10; } inline void addedge(int x,int y,int cal) { ++tot; nxt[tot]=point[x]; point[x]=tot; v[tot]=y; remain[tot]=cal; ++tot; nxt[tot]=point[y]; point[y]=tot; v[tot]=x; remain[tot]=0; } inline bool bfs(int s,int t) { memset(deep,0x7f,sizeof(deep)); queue<int> q; q.push(s); deep[s]=0; while(!q.empty()) { int now=q.front(); q.pop(); for(int i=point[now]; i!=-1; i=nxt[i]) if(deep[v[i]]>inf && remain[i]) { deep[v[i]]=deep[now]+1; q.push(v[i]); } } return deep[t]<inf; } inline int dfs(int now,int t,int limit) { if(now==t || !limit) return limit; int f,flow=0; for(int i=point[now]; i!=-1; i=nxt[i]) if(deep[v[i]]==deep[now]+1 && (f=dfs(v[i],t,min(limit,remain[i])))) { flow+=f; limit-=f; remain[i]-=f; remain[i^1]+=f; if(!limit) break; } return flow; } inline int dinic(int s,int t) { int ans=0; while(bfs(s,t)) ans+=dfs(s,t,inf); return ans; 9397 } int main() { scanf("%d%d",&n,&m); init(); for(int i=1; i<=n; ++i) for(int j=1; j<=m; ++j) scanf("%d",&a[i][j]),num+=a[i][j]; int k=1; for(int i=1; i<=n; ++i) { for(int j=k; j<=m; j+=2) { addedge(s,m*(i-1)+j,a[i][j]); if(i!=1) addedge(m*(i-1)+j,m*(i-2)+j,inf); if(j!=1) addedge(m*(i-1)+j,m*(i-1)+j-1,inf); if(i!=n) addedge(m*(i-1)+j,m*i+j,inf); if(j!=m) addedge(m*(i-1)+j,m*(i-1)+j+1,inf); } k=k==1 ? 2 : 1; for(int j=k; j<=m; j+=2) addedge(m*(i-1)+j,t,a[i][j]); } printf("%d\n",num-dinic(s,t)); return 0; }
相关文章推荐
- 【线性规划与网络流24题 9】方格取数问题
- 线性规划与网络流24题 09方格取数问题
- 网络流24题--方格取数问题
- 【网络流24题】方格取数问题
- 【网络流24题】方格取数问题
- Libre 6007 「网络流 24 题」方格取数 / Luogu 2774 方格取数问题 (网络流,最大流)
- 洛谷2774:[网络流24题]方格取数问题——题解
- [网络流 24 题] 方格取数问题 骑士共存问题
- [网络流24题] 09 方格取数问题 (二分图点权最大独立集,最小割)
- [网络流24题] 方格取数问题 (最大权独立集---网络最小割)
- 【网络流24题】No.9 方格取数问题 (二分图点权最大独立集)
- 线性规划与网络流24——方格取数问题
- 【网络流24题----09】方格取数问题
- [网络流24题] 方格取数问题
- AC日记——[网络流24题]方格取数问题 cogs 734
- Cogs 734. [网络流24题] 方格取数问题(最大闭合子图)
- 【网络流24题】方格取数问题(最大流)
- [网络流24题] 方格取数问题 (最大点权独立集)
- COGS 734. [网络流24题] 方格取数问题
- 【网络流24题】方格取数问题