zzzyc

导航

[BJOI2006]狼抓兔子

这个题,就是网络流的模板题。。。根据题意建图。。。然后跑一边就好了。。。

呆码:

#include<iostream>
#include<cstdio>
#include<queue>
#include<cstring>
#define ll long long
#define N (i-1)*m+j
#define INF 99999999
#define maxn 2000020
using namespace std;
int num=-1,w[maxn*4],head[maxn*4],dep[maxn];
int cur[maxn],n,m,s,t;

struct asd{
    int nxt;
    int to;
} a[maxn*4];
queue <int> q;

inline void add(int x,int y,int z)
{
    a[++num].nxt=head[x];
    a[num].to=y;
    w[num]=z;
    head[x]=num;
}

inline bool bfs()
{
    while(!q.empty()) q.pop();
    memset(dep,0,sizeof(dep));
    dep[s]=1; q.push(s);
    while(!q.empty())
    {
        int now=q.front(); q.pop();
        for(int i=head[now];i!=-1;i=a[i].nxt)
            if(w[i]>0 && dep[a[i].to]==0)
            {
                dep[a[i].to]=dep[now]+1;
                q.push(a[i].to);
            }
    }
    if(dep[t]==0) return 0;
    else return 1;
}

inline int dfs(int u,int dis)
{
    if(u==t) return dis;
    int diss=0;
    for(int& i=cur[u];i!=-1;i=a[i].nxt)
        if(w[i]!=0 && dep[a[i].to]==dep[u]+1)
        {
            int disss=dfs(a[i].to,min(w[i],dis));
            if(disss)
            {
                diss+=disss;
                dis-=disss;
                w[i]-=disss;
                w[i^1]+=disss;
            }
            if(!dis) break;
        }
    return diss;
}

inline ll Dinic()
{
    ll ans=0;
    while(bfs())
    {
        for(int i=s;i<=t;i++) cur[i]=head[i];
        while(int d=dfs(s,INF))
            ans+=d;
    }
    return ans;
}

int main()
{
    memset(head,-1,sizeof(head));
    scanf("%d%d",&n,&m);
    s=1,t=n*m;
    int x;
    for(int i=1;i<=n;i++)
        for(int j=1;j<=m-1;j++)
        {
            scanf("%d",&x);
            add(N,N+1,x);
            add(N+1,N,x);
        }
    for(int i=1;i<=n-1;i++)
        for(int j=1;j<=m;j++)
        {
            scanf("%d",&x);
            add(N,N+m,x);
            add(N+m,N,x);
        }
    for(int i=1;i<=n-1;i++)
        for(int j=1;j<=m-1;j++)
        {
            scanf("%d",&x);
            add(N,N+m+1,x);
            add(N+m+1,N,x);
        }
    printf("%lld\n",Dinic());
}
代码

 

posted on 2018-07-12 08:29  zzzyc  阅读(116)  评论(0编辑  收藏  举报