【dinic模板】bzoj1001狼抓兔子
https://www.zybuluo.com/Junlier/note/1248835
https://www.zybuluo.com/xzyxzy/note/992041
无向图网络流反向弧容量等于正向弧即可,不必建四条弧,因为正反两边不可能同时有流量
last不初始化 num初值要为1
#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;
}