标签:
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 }
网络流最小割 建边非常神奇。
标签:
原文地址:http://www.cnblogs.com/xydddd/p/5294035.html