求赞!
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll N=1000,M=10000;
queue<ll> q;
ll m,n,s,t,idx=1,ans,h[N],e[M],ne[M],w[M],pre[N],d[N],dx[4]= {1,-1,0,0},dy[4]= {0,0,1,-1};
bool st[N];
ll id(ll x,ll y) {
return (x-1)*n+y;
}
void add(ll a,ll b,ll c) {
e[++idx]=b,ne[idx]=h[a],w[idx]=c,h[a]=idx;
}
bool bfs() {
memset(st,0,sizeof(st));
q=queue<ll>();
st[s]=1,d[s]=9e18;
q.push(s);
while(!q.empty()) {
ll u=q.front();
q.pop();
for(ll i=h[u]; i; i=ne[i]) {
ll v=e[i];
if(!st[v] && w[i]) {
st[v]=1,pre[v]=i,d[v]=min(d[u],w[i]);
q.push(v);
if(v==t) return 1;
}
}
}
return 0;
}
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
cin>>m>>n,s=m*n+1,t=m*n+2;
for(ll x=1; x<=m; ++x)
for(ll y=1,v; y<=n; ++y) {
cin>>v,ans+=v;
if((x+y)&1) add(id(x,y),t,v),add(t,id(x,y),0);
else {
add(s,id(x,y),v),add(id(x,y),s,0);
for(ll i=0; i<4; ++i) {
ll nx=x+dx[i],ny=y+dy[i];
if(nx && nx<=m && ny && ny<=n) add(id(x,y),id(nx,ny),9e18),add(id(nx,ny),id(x,y),0);
}
}
}
while(bfs()) {
ans-=d[t];
for(ll u=t; u!=s; u=e[pre[u]^1]) w[pre[u]]-=d[t],w[pre[u]^1]+=d[t];
}
cout<<ans;
return 0;
}