最后一个点内存240多,是wa
#include<bits/stdc++.h>
#define ll long long
using namespace std;
constexpr ll MN=1e6+5;
constexpr ll inf=0x3f3f3f3f;
ll read()
{
int f=1,x=0;int ch=getchar();
while(ch<'0'||ch>'9')
{
if(ch=='-') f=-1;
ch=getchar();
}
while(ch>='0'&&ch<='9')
{
x=(x<<1)+(x<<3)+(ch^48);
ch=getchar();
}
return x*f;
}
ll head[MN],ver[MN*6],edge[MN*6],net[MN*6],d[MN],now[MN];
ll n,m,ss,tt,tot,maxflow;
queue<int> q;
void add(int x,int y,int z)
{
ver[++tot]=y,edge[tot]=z,net[tot]=head[x],head[x]=tot;
ver[++tot]=x,edge[tot]=0,net[tot]=head[y],head[y]=tot;
}
bool bfs()
{
memset(d,0,sizeof(d));
while(q.size()) q.pop();
q.push(ss);d[ss]=1;now[ss]=head[ss];
while(q.size())
{
ll x=q.front();
q.pop();
for(ll i=head[x];i;i=net[i])
if(edge[i]&&!d[ver[i]])
{
q.push(ver[i]);
now[ver[i]]=head[ver[i]];
d[ver[i]]=d[x]+1;
if(ver[i]==tt) return 1;
}
}
return 0;
}
int dinic(int x,int flow)
{
if(x==tt) return flow;
ll rest=flow,k,i;
for(i=now[x];i&&rest;i=net[i])
{
now[x]=i;
if(edge[i]&&d[ver[i]]==d[x]+1)
{
k=dinic(ver[i],min(rest,edge[i]));
if(!k) d[ver[i]]=0;
edge[i]-=k;
edge[i^1]+=k;
rest-=k;
}
}
return flow-rest;
}
int main()
{
// freopen("未命名2.in","r",stdin);
// freopen("未命名2.out","w",stdout);
n=read();m=read();
// s=read();t=read();
ss=1;tt=n*m;
tot=1;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m-1;j++)
{
ll val;
val=read();
add((i-1)*m+j,(i-1)*m+j+1,val);
add((i-1)*m+j+1,(i-1)*m+j,val);
}
}
for(int i=1;i<=n-1;i++)
{
for(int j=1;j<=m;j++)
{
ll val;
val=read();
add((i-1)*m+j,i*m+j,val);
add(i*m+j,(i-1)*m+j,val);
}
}
for(int i=1;i<=n-1;i++)
{
for(int j=1;j<=m-1;j++)
{
ll val;
val=read();
add((i-1)*m+j,i*m+j+1,val);
add(i*m+j+1,(i-1)*m+j,val);
}
}
ll flow=0;
while(bfs() )
{
while((flow=dinic(ss,inf))) maxflow+=flow;
}
printf("%lld",maxflow);
return 0;
}