• [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
    ",Dinic());
    }
    代码
  • 相关阅读:
    2019 SDN上机第2次作业
    2019 SDN上机第1次作业
    第07组 团队Git现场编程实战
    第二次结对编程作业
    c语言之问题集
    2019春第2次课程设计实验安排
    2019年十二周总结
    第十一周总结
    第十周作业
    第九周总结
  • 原文地址:https://www.cnblogs.com/zzzyc/p/9297618.html
Copyright © 2020-2023  润新知