[BJOI 2006] Wolf Catches Rabbit

Topic description:

Rabbit is so cute, why should you catch it!

Topic Analysis:

Naked Minimal Cuts…

Topic link:

BZOJ 1001
Luogu 4001

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

Guess you like

Origin http://10.200.1.11:23101/article/api/json?id=326661063&siteId=291194637
Recommended