Test instructions is obviously the minimum cut, according to the minimum cut maximum flow theorem, the value is equivalent to the maximum flow.
On the template.
#include <iostream>#include<cstdio>#include<cstring>using namespacestd;Const intMAXN =1000010;//maximum number of pointsConst intMAXM =6000060;//maximum number of edgesConst intINF =0x3f3f3f3f;structdinic{intN, M, T, E, FIRST[MAXN], NEXT[MAXM], U[MAXM], V[MAXM], FLOW[MAXM]; intQ[MAXN], D[MAXN], WORK[MAXN], S[MAXN]; voidAddintAintBintf) {U[e]=A; V[e]=b; Flow[e]=F; Next[e]=First[a]; First[a]=e; E++; } voidInitintNintm) { This->n=N; This->m=m; T= n * M-1; E=0; for(i =0; I <= T; i + +) First[i]= -1; } intBFs () {intI, j, rear; for(i =1; I <= T; i + +) D[i]= -1; d[0] =0; Rear=0; Q[rear++] =0; for(i =0; I < rear; i + +) for(j = First[q[i]]; J! =-1; j =Next[j])if(Flow[j] && d[v[j]] = =-1) {D[v[j]]= D[q[i]] +1; if(V[j] = =T)return 1; Q[rear++] =V[j]; } return 0; } intDinic () {intI, J, cur, r, res =0; while(BFS ()) {R=0; Cur=0; for(i =0; I <= T; i + +) Work[i]=First[i]; for(;;) { if(cur = =T) {intA = INF, Minr =R; for(i =0; I < R; i + +) if(Flow[s[i]) <a) {a=Flow[s[i]]; Minr=i; } for(i =0; I < R; i + +) {Flow[s[i]]-=A; Flow[s[i]^1] +=A; } R=Minr; Cur=U[s[r]]; Res+=A; } for(i = work[cur]; I! =-1; i =Next[i])if(Flow[i] && d[v[i]] = = D[cur] +1) Break; Work[cur]=i; if(I! =-1) {S[r++] =i; Cur=V[i]; } Else{D[cur]= -1; if(r = =0) Break; R--; Cur=U[s[r]]; } } } returnRes; }};D inic dinic;intMain () {intn,m; while(SCANF ("%d%d", &n, &m) = =2) {dinic.init (n,m); intx; for(intI=0; i<n; ++i) { for(intj=0; j<m-1; ++j) {scanf ("%d",&x); Dinic.add (i*m+j,i*m+j+1, x); Dinic.add (i*m+j+1, i*m+j,x); } } for(intI=0; i<n-1; ++i) { for(intj=0; j<m; ++j) {scanf ("%d",&x); Dinic.add (i*m+j, (i+1) *m+j,x); Dinic.add ((i+1) *m+j,i*m+j,x); } } for(intI=0; i<n-1; ++i) { for(intj=0; j<m-1; ++j) {scanf ("%d",&x); Dinic.add (i*m+j, (i+1) *m+j+1, x); Dinic.add ((i+1) *m+j+1, i*m+j,x); }} printf ("%d\n", Dinic.dinic ()); } return 0;}View Code
1001: [BeiJing2006] Wolf catch Rabbit (min cut)