【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;
 }

 

posted @ 2018-09-21 19:18  YuXiaoze  阅读(76)  评论(0编辑  收藏  举报