zdlzxg

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
using namespace std;
#define maxn 1007
#define inf 999999999
#define min(x,y) x<y?x:y
int n,m,temp;
int next[maxn],pre[maxn],cap[maxn],to[maxn],vis[maxn];
inline int RD()
{
char ch;
int res=0;
ch=getchar();
while(ch>'0'||ch<'0')ch=getchar();
res=ch-'0';
while((ch=getchar()<='9')&&ch>='0')res=res*10+ch-'0';
return res;
}
inline void addedge(int x,int y,int val)
{
static int counter=0;
next[++counter]=pre[x];pre[x]=counter;cap[counter]=val;to[counter]=y;
next[++counter]=pre[y];pre[y]=counter;cap[counter]=val;to[counter]=x;
}
int bfs(int src,int des)
{
queue<int> Q;
while(!Q.empty())Q.pop();
Q.push(src);
while(!Q.empty())
{
int x=Q.front();Q.pop();
if(x==des)return 1;
for(int i=pre[i];i;i=next[i])
{
int y=to[i];
if(cap[i]>0&&!vis[i])
vis[i]=vis[x]+1,Q.push(y);
}
}
return 0;
}
void work(int x,int y,int temp)
{
for(int i=pre[x];i;i=next[i])
if(to[i]==y)cap[i]-=temp;
for(int i=pre[y];i;i=next[i])
if(to[i]==x)cap[i]+=temp;
}
int dfs(int src,int des)
{
int ans=inf,temp;
for(int i=pre[src];i;i=next[i])
{
if(cap[i]&&vis[to[i]]==vis[src]+1&&(temp=dfs(to[i],des)))
{
work(src,to[i],temp);
ans=min(temp,ans);
}
}
if(ans!=inf)return ans;
return 0;
}
int dinic(int src,int des)
{
int ans=0;
while(bfs(src,des))
{
ans+=dfs(src,des);
}
return ans;
}
int main()
{
n=RD(),m=RD();
for(int i=1;i<=n;i++)
for(int j=1;j<=m-1;j++)
temp=RD(),addedge((i-1)*m+j,(i-1)*m+1+j,temp);
for(int i=1;i<=n-1;i++)
for(int j=1;j<=m;j++)
temp=RD(),addedge((i-1)*m+j,i*m+j,temp);
printf("%d ",dinic(1,n*m));
}
posted @ 2017-05-02 22:01  OcahIBye  阅读(147)  评论(0编辑  收藏  举报