这个题,就是网络流的模板题。。。根据题意建图。。。然后跑一边就好了。。。
呆码:
#include<iostream> #include<cstdio> #include<queue> #include<cstring> #define ll long long #define N (i-1)*m+j #define INF 99999999 #define maxn 2000020 using namespace std; int num=-1,w[maxn*4],head[maxn*4],dep[maxn]; int cur[maxn],n,m,s,t; struct asd{ int nxt; int to; } a[maxn*4]; queue <int> q; inline void add(int x,int y,int z) { a[++num].nxt=head[x]; a[num].to=y; w[num]=z; head[x]=num; } inline bool bfs() { while(!q.empty()) q.pop(); memset(dep,0,sizeof(dep)); dep[s]=1; q.push(s); while(!q.empty()) { int now=q.front(); q.pop(); for(int i=head[now];i!=-1;i=a[i].nxt) if(w[i]>0 && dep[a[i].to]==0) { dep[a[i].to]=dep[now]+1; q.push(a[i].to); } } if(dep[t]==0) return 0; else return 1; } inline int dfs(int u,int dis) { if(u==t) return dis; int diss=0; for(int& i=cur[u];i!=-1;i=a[i].nxt) if(w[i]!=0 && dep[a[i].to]==dep[u]+1) { int disss=dfs(a[i].to,min(w[i],dis)); if(disss) { diss+=disss; dis-=disss; w[i]-=disss; w[i^1]+=disss; } if(!dis) break; } return diss; } inline ll Dinic() { ll ans=0; while(bfs()) { for(int i=s;i<=t;i++) cur[i]=head[i]; while(int d=dfs(s,INF)) ans+=d; } return ans; } int main() { memset(head,-1,sizeof(head)); scanf("%d%d",&n,&m); s=1,t=n*m; int x; for(int i=1;i<=n;i++) for(int j=1;j<=m-1;j++) { scanf("%d",&x); add(N,N+1,x); add(N+1,N,x); } for(int i=1;i<=n-1;i++) for(int j=1;j<=m;j++) { scanf("%d",&x); add(N,N+m,x); add(N+m,N,x); } for(int i=1;i<=n-1;i++) for(int j=1;j<=m-1;j++) { scanf("%d",&x); add(N,N+m+1,x); add(N+m+1,N,x); } printf("%lld ",Dinic()); }