1 #include<cstdio>
  2 #include<iostream>
  3 #include<cstring>
  4 #define M 100009
  5 #define inf 2139062143
  6 using namespace std;
  7 int n,m,a[102][102],b[102][102],c[102][102],tot,cnt=1,T,ans,head[M],d[M],q[2*M],next[10*M],u[10*M],v[10*M];
  8 int xx[4]={0,0,1,-1},yy[4]={1,-1,0,0};
  9 bool bfs()
 10 {
 11     memset(d,0,sizeof(int)*(T+1));
 12     int h=0,t=1;
 13     q[1]=0;
 14     d[0]=1;
 15     for(;h<t;)
 16       {
 17         h++;
 18         int p=q[h];
 19         for(int i=head[p];i;i=next[i])
 20           if(!d[u[i]]&&v[i])
 21             {
 22                 d[u[i]]=d[p]+1;
 23                 if(d[T])
 24                   return 1;
 25                 t++;
 26                 q[t]=u[i];
 27             }
 28       }
 29     return 0;
 30 }
 31 int dinic(int s,int f)
 32 {
 33     if(s==T)
 34       return f;
 35     int rest=f;
 36     for(int i=head[s];i&&rest;i=next[i])
 37       if(v[i]&&d[u[i]]==d[s]+1)
 38         {
 39             int now=dinic(u[i],min(rest,v[i]));
 40             if(!now)
 41               d[u[i]]=0;
 42             v[i]-=now;
 43             v[i^1]+=now;
 44             rest-=now;
 45         }
 46     return f-rest;  
 47 }
 48 void jia1(int a1,int a2,int a3)
 49 {
 50     cnt++;
 51     next[cnt]=head[a1];
 52     head[a1]=cnt;
 53     u[cnt]=a2;
 54     v[cnt]=a3;
 55     return;
 56 }
 57 void jia(int a1,int a2,int a3)
 58 {
 59     jia1(a1,a2,a3);
 60     jia1(a2,a1,0);
 61     return;
 62 }
 63 int main()
 64 {
 65     scanf("%d%d",&n,&m);
 66     T=n*m+1;
 67     for(int i=1;i<=n;i++)
 68       for(int j=1;j<=m;j++)
 69         {
 70           scanf("%d",&a[i][j]);
 71           tot+=a[i][j];    
 72           a[i][j]*=2;
 73         }
 74     for(int i=1;i<=n;i++)
 75       for(int j=1;j<=m;j++)
 76         {
 77           scanf("%d",&b[i][j]);
 78           tot+=b[i][j];
 79           b[i][j]*=2;
 80         }
 81     for(int i=1;i<n;i++)
 82       for(int j=1;j<=m;j++)
 83         {
 84             int a1;
 85             scanf("%d",&a1);
 86             tot+=a1;
 87             a[i][j]+=a1;
 88             a[i+1][j]+=a1;
 89             jia((i-1)*m+j,i*m+j,a1);
 90             jia(i*m+j,(i-1)*m+j,a1);
 91         }
 92     for(int i=1;i<n;i++)
 93       for(int j=1;j<=m;j++)
 94         {
 95             int a1;
 96             scanf("%d",&a1);
 97             tot+=a1;
 98             b[i][j]+=a1;
 99             b[i+1][j]+=a1;
100             jia((i-1)*m+j,i*m+j,a1);
101             jia(i*m+j,(i-1)*m+j,a1);
102         }
103     for(int i=1;i<=n;i++)
104       for(int j=1;j<m;j++)
105         {
106             int a1;
107             scanf("%d",&a1);
108             tot+=a1;
109             a[i][j]+=a1;
110             a[i][j+1]+=a1;
111             jia((i-1)*m+j,(i-1)*m+j+1,a1);
112             jia((i-1)*m+j+1,(i-1)*m+j,a1);
113         }
114     for(int i=1;i<=n;i++)
115       for(int j=1;j<m;j++)
116         {
117             int a1;
118             scanf("%d",&a1);
119             tot+=a1;
120             b[i][j]+=a1;
121             b[i][j+1]+=a1;
122             jia((i-1)*m+j,(i-1)*m+j+1,a1);
123             jia((i-1)*m+j+1,(i-1)*m+j,a1);
124         }   
125     for(int i=1;i<=n;i++)
126       for(int j=1;j<=m;j++)
127         {
128             jia(0,(i-1)*m+j,a[i][j]);
129             jia((i-1)*m+j,T,b[i][j]);
130         }
131     for(;bfs();)
132       ans+=dinic(0,inf);
133     printf("%d\n",tot-(ans/2));
134     return 0;
135 }

网络流最小割 建边非常神奇。

S向i连变容量为文[i]+文[i][j]/2,向j连边容量为文[j]+文[i][j]/2。i向T连边容量为理[i]+理[i][j]/2,j向T连边容量为理[j]+理[i][j]/2;i于j连边,容量为文[i][j]/2+理[i][j]/2.

posted on 2016-03-18 23:09  xiyuedong  阅读(185)  评论(0编辑  收藏  举报