1
2 #include <iostream>
3 #include <cstdio>
4 #include <cstring>
5 #include <cmath>
6 #include <cstdlib>
7 #include <queue>
8 #define N 1000000
9 #define inf 0x7fffffff
10 using namespace std;
11
12 struct data{int next,point,v;}e[6*N+10];
13 int cur[N+10],deep[N+10],head[2*N+10],q[N+10];
14 int tn,n,m,ans;
15
16 inline int get()
17 {
18 char c;int anss=0;
19 while ((c=getchar())==‘ ‘ || c==‘\n‘ || c==‘\r‘);
20 anss=c-‘0‘;
21 while (isdigit(c=getchar())) anss=anss*10+c-‘0‘;
22 return anss;
23 }
24
25 inline bool bfs(int s,int t)
26 {
27 memset(deep,-1,sizeof(deep));
28 // for (int i=0;i<=n;i++) cur[i]=head[i];
29 deep[s]=0;
30 int tt=0,w=1;
31 q[tt]=s;
32 while (tt<w)
33 {
34 int now=q[tt]; tt++;
35 for (int tn=head[now];tn!=-1;tn=e[tn].next)
36 if (deep[e[tn].point]==-1 && e[tn].v)
37 deep[e[tn].point]=deep[now]+1,q[w++]=e[tn].point;
38 }
39 if (deep[t]==-1) return 0;
40 return 1;
41 }
42
43 int dfs(int now,int t,int limit)
44 {
45 if (!limit || now==t) return limit;
46 int flow=0,f,used=0;
47 for (int tn=head[now];tn!=-1;tn=e[tn].next)
48 {
49 //cur[now]=tn;
50 if (deep[e[tn].point]==deep[now]+1 && e[tn].v)
51 {
52 f=limit-used;
53 f=dfs(e[tn].point,t,min(e[tn].v,f));
54 used+=f;
55 e[tn].v-=f;
56 e[tn^1].v+=f;
57 if (used==limit) return limit;
58 }
59 }
60 if (!used) deep[now]=-1;
61 return used;
62 }
63
64 void se(int x,int y,int w)
65 {
66 tn++; e[tn].next=head[x]; head[x]=tn; e[tn].point=y; e[tn].v=w;
67 tn++; e[tn].next=head[y]; head[y]=tn; e[tn].point=x; e[tn].v=w;
68 }
69
70 void dinic(int s,int t)
71 {
72 while (bfs(s,t)) ans+=dfs(s,t,inf);
73 }
74
75 int main()
76 {
77 //freopen("bjrabbit.in","r",stdin);
78 //freopen("bjrabbit.out","w",stdout);
79 int w;
80 tn=-1;
81 memset(e,-1,sizeof(e));
82 memset(head,-1,sizeof(head));
83 n=get(); m=get();
84 for (int i=1;i<=n;i++)
85 for(int j=1;j<m;j++)
86 w=get(),se(m*(i-1)+j,m*(i-1)+j+1,w);
87 for (int i=1;i<n;i++)
88 for (int j=1;j<=m;j++)
89 w=get(),se(m*(i-1)+j,m*i+j,w);
90 for (int i=1;i<n;i++)
91 for (int j=1;j<m;j++)
92 w=get(),se(m*(i-1)+j,m*i+j+1,w);
93 dinic(1,n*m);
94 printf("%d\n",ans);
95 return 0;
96 }