Topic description:
Rabbit is so cute, why should you catch it!
Topic Analysis:
Naked Minimal Cuts…
Topic link:
AC code:
#include <cstdio>
#include <cstring>
#include <queue>
#include <iostream>
const int maxm=3*1100*1100;
const int inf=0x7fffffff;
int head[maxm],to[maxm<<1],cap[maxm<<1],net[maxm<<1];
int cnt=1,n,m;
int id[1100][1100];
inline void addedge(int u,int v,int c)
{
cnt++;
to[cnt]=v,cap[cnt]=c,net[cnt]=head[u],head[u]=cnt;
cnt++;
to[cnt]=u,cap[cnt]=c,net[cnt]=head[v],head[v]=cnt;
}
namespace Maxflow{
std::queue <int> dl;
int deep[maxm];
inline bool BFS(int s,int t)
{
memset(deep,-1,sizeof(deep));
dl.push(s);
deep[s]=0;
while(!dl.empty())
{
int now=dl.front();
dl.pop();
for(int i=head[now];i;i=net[i])
if(cap[i]&&deep[to[i]]==-1)
deep[to[i]]=deep[now]+1,dl.push(to[i]);
}
return deep[t]!=-1;
}
int DFS(int now,int flow,int t)
{
if(now==t) return flow;
int used=0,w;
for(int i=head[now];i;i=net[i])
if(cap[i]&&deep[to[i]]==deep[now]+1)
{
w=DFS(to[i],std::min(cap[i],flow-used),t);
used+=w;
cap[i]-=w,cap[i^1]+=w;
if(flow==used) return used;
}
if(!used) deep[now]=-1;
return used;
}
inline int Dinic(int s,int t)
{
int maxflow=0;
while(BFS(s,t)) maxflow+=DFS(s,inf,t);
return maxflow;
}
}
int main()
{
scanf("%d%d",&n,&m);
int tot=0;
for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) id[i][j]=++tot;
for(int i=1;i<=n;i++)
for(int j=1,x;j<m;j++)
{
scanf("%d",&x);
addedge(id[i][j],id[i][j+1],x);
//addedge(id[i][j+1],id[i][j],x);
}
for(int i=1;i<n;i++)
for(int j=1,x;j<=m;j++)
{
scanf("%d",&x);
addedge(id[i][j],id[i+1][j],x);
//addedge(id[i+1][j],id[i][j],x);
}
for(int i=1;i<n;i++)
for(int j=1,x;j<m;j++)
{
scanf("%d",&x);
addedge(id[i][j],id[i+1][j+1],x);
//addedge(id[i+1][j+1],id[i][j],x);
}
printf("%d\n",Maxflow::Dinic(1,n*m));
return 0;
}