大佬的网络流能过,我的网络流T到飞起,所以只能写 平面图转对偶图 然后 跑spfa
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <queue>
#include <algorithm>
#include <cstring>
#include <string>
using namespace std;
const int maxn=2000010;
int n,m,st[maxn*3+100],nt[maxn*3+100],to[maxn*3+100],topt,s,t;
long long dis[maxn],v[maxn*3+100],vv;
bool f[maxn];
inline void add(int x,int y,long long c)
{
to[++topt]=y; nt[topt]=st[x]; st[x]=topt; v[topt]=c;
to[++topt]=x; nt[topt]=st[y]; st[y]=topt; v[topt]=c;
}
queue<int>q;
inline void spfa()
{
memset(dis,0x7f,sizeof dis);
dis[s]=0; q.push(s); f[s]=1;
while (!q.empty())
{
int x=q.front(); q.pop(); f[x]=0;
int p=st[x];
while (p)
{
if (dis[to[p]]>dis[x]+v[p])
{
dis[to[p]]=dis[x]+v[p];
if (!f[to[p]]) {f[to[p]]=1; q.push(to[p]);}
}
p=nt[p];
}
}
}
int main()
{
scanf("%d%d",&n,&m); s=1; t=2+2*(n-1)*(m-1);
for (int i=1;i<=n;i++)
for (int j=1;j<=m-1;j++)
{
scanf("%lld",&vv);
if (i==1) add(2*(i-1)*(m-1)+2*j+1,t,vv);
else if (i==n) add(2*(i-2)*(m-1)+2*j,s,vv);
else add(2*(i-1)*(m-1)+2*j+1,2*(i-1)*(m-1)+2*j-2*(m-1),vv);
}
for (int i=1;i<=n-1;i++)
for (int j=1;j<=m;j++)
{
scanf("%lld",&vv);
if (j==1) add(s,2*(i-1)*(m-1)+2*j,vv);
else if (j==m) add(2*(i-1)*(m-1)+2*j-1,t,vv);
else add(2*(i-1)*(m-1)+2*j,2*(i-1)*(m-1)+2*j-1,vv);
}
for (int i=1;i<=n-1;i++)
for (int j=1;j<=m-1;j++)
{
scanf("%lld",&vv);
add(2*(i-1)*(m-1)+2*j+1,2*(i-1)*(m-1)+2*j,vv);
}
spfa();
printf("%lld\n",dis[t]);
return 0;
}