1. 程式人生 > >【dinic模板】BZOJ1001 狼抓兔子

【dinic模板】BZOJ1001 狼抓兔子

#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;

}