记录编号 571715 评测结果 AAAAAAAAAAA
题目名称 [网络流24题] 方格取数问题 最终得分 100
用户昵称 Gravatar梦那边的美好ET 是否通过 通过
代码语言 C++ 运行时间 0.008 s
提交时间 2022-06-15 21:11:12 内存使用 0.54 MiB
显示代码纯文本
#include<bits/stdc++.h>
#define maxn 1010
#define maxm 4000010
#define inf 2147483647
using namespace std;
vector<int>b[maxn],c[maxn],to[maxn];
void add(int x,int y,int c1){
	b[x].push_back(y);b[y].push_back(x);
	c[x].push_back(c1);c[y].push_back(0);
	to[x].push_back(b[y].size()-1);to[y].push_back(b[x].size()-1);
	return;
}
int s,t,d[maxn],l,r,dis[maxn];
int bfs(){
	for(int i=1;i<=t;i++)dis[i]=-1;
	l=r=0;d[++r]=s;dis[s]=0;
	while(l!=r){int u=d[++l];
		for(int i=0;i<b[u].size();i++){
			int v=b[u][i],c1=c[u][i];
			if(dis[v]==-1&&c1>0)
				dis[v]=dis[u]+1,d[++r]=v;
		}
	}
	return (dis[t]==-1)?0:1;
}
int dfs(int p,int a){
	if(p==t)return a;
	int fl=0,f;
	for(int i=0;i<b[p].size();i++){
	    int v=b[p][i],c1=c[p][i];
	    if(c1<=0)continue;
	    if(dis[v]==dis[p]+1&&(f=dfs(v,min(a,c1)))>0)
	    	fl+=f,a-=f,c[p][i]-=f,c[v][to[p][i]]+=f;
        if(a==0)break;
	}
	if(a==0)dis[p]=-1;
	return fl;
}
int dinic(){
	int ans=0;
	while(bfs())ans+=dfs(s,inf);
	return ans;
}
int n,m,a1,ans;
int main(){
	freopen("grid.in","r",stdin);
	freopen("grid.out","w",stdout);
	scanf("%d%d",&n,&m);
	s=n*m+1,t=n*m+2;
	for(int i=1;i<=n;i++){
	    for(int j=1;j<=m;j++){
	    	scanf("%d",&a1);ans+=a1;
	    	if((i+j)%2==0){
	    	    add(s,m*(i-1)+j,a1);
				if(i!=1)add(m*(i-1)+j,m*(i-2)+j,inf);	
				if(i!=n)add(m*(i-1)+j,m*i+j,inf);
				if(j!=1)add(m*(i-1)+j,m*(i-1)+j-1,inf);	
				if(j!=m)add(m*(i-1)+j,m*(i-1)+j+1,inf);	
			}
	    	else add(m*(i-1)+j,t,a1);
		}
	}
	printf("%d\n",ans-dinic());
	return 0;
}