您的位置:首页 > 理论基础 > 计算机网络

【网络流24题】方格取数问题

2017-07-17 12:46 330 查看

【网络流24题】方格取数问题

Description

在一个有m * n 个方格的棋盘中,每个方格中有一个正整数。现要从方格中取数,使任意2 个数所在方格没有公共边,且取出的数的总和最大。试设计一个满足要求的取数算法。对于给定的方格棋盘,按照取数要求编程找出总和最大的数。

Input

第1 行有2 个正整数m和n,分别表示棋盘的行数和列数。
接下来的m行,每行有n个正整数,表示棋盘方格中的数。

Output

将取数的最大总和输出

Sample Input

3 3
1 2 3
3 2 3
2 3 1

Sample Output

11

Hint

数据范围:
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。。。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: