https://www.luogu.com.cn/record/118177298
#include<bits/stdc++.h>
#define int long long
using namespace std;
namespace lsq {
typedef int lsqxx;
struct lq {
struct lqbz {
lsqxx v,w,nxt;
} e[10000005];
lsqxx h[10000005],cnt=1;
inline void add(lsqxx u,lsqxx v,lsqxx w=1) {
e[++cnt].v=v;
e[cnt].w=w;
e[cnt].nxt=h[u];
h[u]=cnt;
}
#define F(z,u) for(int j=z.h[u],v=z.e[j].v,w=z.e[j].w;j;j=z.e[j].nxt,v=z.e[j].v,w=z.e[j].w)
}q;
};
using namespace lsq;
int n,m,s=0,t=1,cnt;
int art[505][505],science[505][505];
int same_art[505][505],same_science[505][505];
int d[10000005];
int dcnt=0;
void BFS()
{
memset(d,-1,sizeof(d));
queue<int>r;
r.push(t);
d[t]=0;
while(!r.empty())
{
int cht=r.front();r.pop();
F(q,cht)
{
if(d[v]!=-1) continue;
if(w!=0) continue;
d[v]=d[cht]+1;
r.push(v);
}
}
}
int dfs(int u=s,int in=INT_MAX)
{
// cout<<u<<endl;
if(u==t) {return in;}
int out=0;
F(q,u)
{
// cout<<v<<endl;
if(d[u]>d[v]&&w)
{
int nt=dfs(v,min(w,in));
in-=nt;out+=nt;
q.e[j].w-=nt;q.e[j^1].w+=nt;
if(!in) return out;
}
}
++d[u];
return out;
}
int ISAP()
{
int ans=0;
BFS();
while(d[s]<dcnt) ans+=dfs();
return ans;
}
int two_one(int x,int y)
{
return (x-1)*m+y+1;
}
int ans=0;
signed main()
{
cin>>n>>m;
dcnt=n*m*2+2;
cnt=n*m+5;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
{
int l=scanf("%lld",&art[i][j]);
ans+=art[i][j];
}
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
{
int l=scanf("%lld",&science[i][j]);
ans+=science[i][j];
}
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
{
int l=scanf("%lld",&same_art[i][j]);
ans+=same_art[i][j];
}
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
{
int l=scanf("%lld",&same_science[i][j]);
ans+=same_science[i][j];
}
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
{
q.add(s,two_one(i,j),art[i][j]);
q.add(two_one(i,j),s,0);
q.add(two_one(i,j),t,science[i][j]);
q.add(t,two_one(i,j),0);
//IF NOW IS 80
int dx[5]={0,1,0,-1,0};
int dy[5]={0,0,1,0,-1};
q.add(s,++cnt,same_art[i][j]);
q.add(cnt,s,0);
q.add(cnt,two_one(i,j),INT_MAX);
q.add(two_one(i,j),cnt,0);
for(int k=1;k<=4;k++)
{
int xx=i+dx[k],yy=j+dy[k];
if(xx<1||yy<1||xx>n||yy>m) continue;
q.add(cnt,two_one(xx,yy),INT_MAX);
q.add(two_one(xx,yy),cnt,0);
}
q.add(++cnt,t,same_science[i][j]);
q.add(t,cnt,0);
q.add(two_one(i,j),cnt,INT_MAX);
q.add(cnt,two_one(i,j),0);
for(int k=1;k<=4;k++)
{
int xx=i+dx[k],yy=j+dy[k];
if(xx<1||yy<1||xx>n||yy>m) continue;
q.add(two_one(xx,yy),cnt,INT_MAX);
q.add(cnt,two_one(xx,yy),0);
}
}
cout<<ans-ISAP()<<endl;
return 0;
}