【dinic模板】BZOJ1001 狼抓兔子 阿新 • • 發佈:2018-12-10 #include<cstdio> #include<cstring> #include<queue> #include<algorithm> using namespace std; const int N=1000+5,M=1000+5; int n,m; long long ans; int num=1,last[N*M],nxt[6*N*M],ver[6*N*M],c[6*N*M]; inline void add(int x,int y,int z) {nxt[++num]=last[x]; last[x]=num; ver[num]=y; c[num]=z; nxt[++num]=last[y]; last[y]=num; ver[num]=x; c[num]=z; } queue<int> q; int cur[N*M],d[N*M]; inline bool bfs() {memset(d,0,sizeof(d)); while(q.size()) q.pop(); for(int i=1;i<=n*m;i++) cur[i]=last[i]; q.push(1); d[1]=1; while(q.size()) {int x=q.front(); q.pop(); for(int i=last[x],y;i;i=nxt[i]) if(!d[y=ver[i]] && c[i]) {d[y]=d[x]+1; q.push(y); if(y==n*m) return 1; } } return 0; } int dfs(int x,int flow) {if(x==n*m) return flow; int rest=flow; for(int i=cur[x];i && rest;i=nxt[i]) {cur[x]=i; int y=ver[i]; if(d[y]==d[x]+1 && c[i]) {int f=dfs(y,min(rest,c[i])); if(f==0) d[y]=0; c[i]-=f; rest-=f; c[i^1]+=f; } } return flow-rest; } int main() { scanf("%d%d",&n,&m); int r; for(int i=1;i<=n;i++) for(int j=1;j<m;j++) {scanf("%d",&r); add((i-1)*m+j,(i-1)*m+j+1,r);} for(int i=1;i<n;i++) for(int j=1;j<=m;j++) {scanf("%d",&r); add((i-1)*m+j,i*m+j,r);} for(int i=1;i<n;i++) for(int j=1;j<m;j++) {scanf("%d",&r); add((i-1)*m+j,i*m+j+1,r);} while(bfs()) while(long long flow=dfs(1,2147483647)) ans+=flow; printf("%lld",ans); return 0; }