// Problem: P2774 方格取数问题
// Contest: Luogu
// URL: https://www.luogu.com.cn/problem/P2774
// Memory Limit: 125 MB
// Time Limit: 1000 ms
#include<stdio.h>
namespace maximum_flow{
const int maxv=10002,maxe=100000;
int n,s,t,tot,head[maxv],cur[maxv],dis[maxv];
struct{int v,c,nxt;}e[maxe];
inline void init(){
for(int i=0;i<=n;++i)head[i]=-1;
}
inline void addedge(int u,int v,int c){
e[tot]={v,c,head[u]},head[u]=tot++;
e[tot]={u,0,head[v]},head[v]=tot++;
}
bool bfs(){
static int q[maxv];
int l=0,r=0;
for(int i=0;i<=n;++i)cur[i]=head[i],dis[i]=-1;
for(q[r++]=s,dis[s]=0;l<r;++l)
for(int j=head[q[l]];~j;j=e[j].nxt)
if(e[j].c&&dis[e[j].v]==-1)
dis[e[j].v]=dis[q[l]]+1,q[r++]=e[j].v;
return ~dis[t];
}
int dfs(int u,int lim=0x7fffffff){
if(u==t)return lim;
int res=0,flow;
for(int&i=cur[u];~i;i=e[i].nxt)
if(e[i].c&&dis[e[i].v]==dis[u]+1&&(flow=dfs(e[i].v,e[i].c>lim?lim:e[i].c))){
e[i].c-=flow,e[i^1].c+=flow;
if(!(res+=flow,lim-=flow))break;
}
if(!res)dis[u]=-1;
return res;
}
int dinic(){
int res=0;
for(;bfs();res+=dfs(s));
return res;
}
}
int main(){
int n,m,x,res=0;
scanf("%d%d",&n,&m);
maximum_flow::n=n*m+2,maximum_flow::s=0,maximum_flow::t=n*m+1,maximum_flow::init();
for(int i=1;i<=n;++i)
for(int j=1;j<=m;++j){
scanf("%d",&x),res+=x;
if(i+j&1)maximum_flow::addedge((i-1)*n+j,maximum_flow::t,x);
else maximum_flow::addedge(maximum_flow::s,(i-1)*n+j,x);
}
for(int i=1;i<=n;++i)
for(int j=1;j<m;++j)
if(i+j&1)
maximum_flow::addedge((i-1)*n+j+1,(i-1)*n+j,0x7fffffff);
else
maximum_flow::addedge((i-1)*n+j,(i-1)*n+j+1,0x7fffffff);
for(int i=1;i<n;++i)
for(int j=1;j<=m;++j)
if(i+j&1)
maximum_flow::addedge(i*n+j,(i-1)*n+j,0x7fffffff);
else
maximum_flow::addedge((i-1)*n+j,i*n+j,0x7fffffff);
printf("%d\n",res-=maximum_flow::dinic());
return 0;
}
调了一晚上了,调不出来了