样例没过,out155
#include<bits/stdc++.h>
#define int long long
#define inf (1e18)
using namespace std;
const int N=400005;
int n,m,s,t,x,head[N],to[N],w[N],nxt[N],cnt=2,dis[N],cur[N],ans,tot;
queue<int>q;
int doit(int x,int y){
return (x-1)*m+y;
}
void add(int x,int y,int z){
to[cnt]=y;
w[cnt]=z;
nxt[cnt]=head[x];
head[x]=cnt++;
to[cnt]=x;
w[cnt]=0;
nxt[cnt]=head[y];
head[y]=cnt++;
}
bool bfs(){
for(int i=s;i<=t;i++) dis[i]=inf;
cur[s]=head[s];
dis[s]=0;
q.push(s);
while(!q.empty()){
int u=q.front();
q.pop();
for(int i=head[u];i;i=nxt[i]){
int v=to[i];
if(dis[v]<inf||!w[i]) continue;
cur[v]=head[v];
dis[v]=dis[u]+1;
q.push(v);
}
}
return dis[t]<inf;
}
int dfs(int u,int fl){
if(u==t) return fl;
int res=0;
for(int i=cur[u];i;i=nxt[i]){
cur[u]=i;
int v=to[i];
if(dis[v]!=dis[u]+1||!w[i]) continue;
int f=dfs(v,min(fl,w[i]));
if(!f) dis[v]=inf;
res+=f;
fl-=f;
w[i]-=f;
w[i^1]+=f;
if(!fl) return res;
}
return res;
}
signed main(){
cin>>n>>m;
t=3*n*m+1;
tot=n*m;
for(int i=1;i<=n;i++) for(int j=1;j<=m;j++){
cin>>x;
ans+=x;
add(s,doit(i,j),x);
}
for(int i=1;i<=n;i++) for(int j=1;j<=m;j++){
cin>>x;
ans+=x;
add(doit(i,j),t,x);
}
for(int i=1;i<=n;i++) for(int j=1;j<=m;j++){
cin>>x;
ans+=x;
add(s,++tot,x);
add(tot,doit(i,j),inf);
if(i+1<n) add(tot,doit(i+1,j),inf);
if(i>1) add(tot,doit(i-1,j),inf);
if(j+1<m) add(tot,doit(i,j+1),inf);
if(j>1) add(tot,doit(i,j-1),inf);
}
for(int i=1;i<=n;i++) for(int j=1;j<=m;j++){
cin>>x;
ans+=x;
add(++tot,t,x);
add(doit(i,j),tot,inf);
if(i+1<n) add(doit(i+1,j),tot,inf);
if(i>1) add(doit(i-1,j),tot,inf);
if(j+1<m) add(doit(i,j+1),tot,inf);
if(j>1) add(doit(i,j-1),tot,inf);
}
while(bfs()) ans-=dfs(s,inf);
cout<<ans;
}