【网络流24题】方格取数问题
2017-07-17 12:46
330 查看
【网络流24题】方格取数问题
Description
在一个有m * n 个方格的棋盘中,每个方格中有一个正整数。现要从方格中取数,使任意2 个数所在方格没有公共边,且取出的数的总和最大。试设计一个满足要求的取数算法。对于给定的方格棋盘,按照取数要求编程找出总和最大的数。Input
第1 行有2 个正整数m和n,分别表示棋盘的行数和列数。接下来的m行,每行有n个正整数,表示棋盘方格中的数。
Output
将取数的最大总和输出Sample Input
3 31 2 3
3 2 3
2 3 1
Sample Output
11Hint
数据范围:1<=N,M<=30
Source
网络流二分图点权最大独立集, 网络最小割
思路:取出的点要互不相交,所以考虑用二分图来做。同时这是个裸的最大点权独立集独立集问题,可以用最小点权覆盖集来做。把点黑白染色,S->黑色点(w=黑色点方格上数字),白色点->T(w=白色点方格上数字),同时黑色点->与他相邻的白色点(w=inf)。所有点权之和-流量即为答案
// It is made by XZZ #include<cstdio> #include<algorithm> #include<cstring> #define File #define Fname "grid" using namespace std; #define rep(a,b,c) for(rg int a=b;a<=c;a++) #define drep(a,b,c) for(rg int a=b;a>=c;a--) #define erep(a,b) for(rg int a=fir[b];a;a=nxt[a]) #define il inline #define rg register #define vd void #define t (dis[i]) typedef long long ll; il int gi(){ rg int x=0;rg char ch=getchar(); while(ch<'0'||ch>'9')ch=getchar(); while(ch>='0'&&ch<='9')x=x*10+ch-'0',ch=getchar(); return x; } const int maxn=30*30+10,maxm=30*30*4+100,S=1,T=2; int fir[maxn],nxt[maxm],dis[maxm],w[maxm],id=1; int X[]={23333,0,0,1,-1},Y[]={23333,1,-1,0,0}; il vd add(int a,int b,int c){ nxt[++id]=fir[a],fir[a]=id,dis[id]=b,w[id]=c; if(c)add(b,a,0); } int num[31][31]; bool vis[maxn]; il int ff(int now,int end,int minn){ if(now==end)return minn; vis[now]=1; erep(i,now) if(!vis[dis[i]]&&w[i]){ rg int down=ff(dis[i],end,min(minn,w[i])); if(down){w[i]-=down,w[i^1]+=down;return down;} } return 0; } int main(){ freopen(Fname".in","r",stdin); freopen(Fname".out","w",stdout); int n=gi(),m=gi(),Id=2,sum=0,a=0; rep(i,1,n)rep(j,1,m){ num[i][j]=++Id; sum+=a=gi(); if((i+j)&1)add(S,num[i][j],a); else add(num[i][j],T,a); } rep(i,1,n)rep(j,1,m)if((i+j)&1)rep(k,1,4) if(num[i+X[k]][j+Y[k]])add(num[i][j],num[i+X[k]][j+Y[k]],666666666); int flow,Flow=0; while(flow=ff(S,T,666666666))Flow+=flow,memset(vis,0,sizeof vis); printf("%d\n",sum-Flow); return 0; }
View Code
PS.题目太水了,用了FF,依然2ms。。。
相关文章推荐
- 【网络流24题】方格取数问题(最大流)
- [网络流24题] 09 方格取数问题 (二分图点权最大独立集,最小割)
- AC日记——[网络流24题]方格取数问题 cogs 734
- cogs 734. [网络流24题] 方格取数问题
- [网络流24题] 方格取数问题(cogs 734)
- 【线性规划与网络流24题 9】方格取数问题
- [网络流24题] 方格取数问题 (最大点权独立集)
- 网络流24题--方格取数问题
- 【网络流24题】No.9 方格取数问题 (二分图点权最大独立集)
- [网络流24题 #9]方格取数问题
- 【网络流24题】方格取数问题
- [网络流24题 #9]方格取数问题
- 【网络流24题】方格取数问题
- [网络流24题] 方格取数问题 (最大权独立集---网络最小割)
- Libre 6007 「网络流 24 题」方格取数 / Luogu 2774 方格取数问题 (网络流,最大流)
- [网络流24题]方格取数问题
- [网络流 24 题] 方格取数问题 骑士共存问题
- 线性规划与网络流24——方格取数问题
- 【网络流24题----09】方格取数问题
- 洛谷2774:[网络流24题]方格取数问题——题解