• 【bzoj1001】[BeiJing2006]狼抓兔子


    最大流
    数据有些鬼。。开小容易RE,开大就MLE。。
     
    存双向边
    然后直接跑dinic
     
    注意读入有些复杂= =
     
    速度还是跟得上的
     
    Problem: 1001
    User: YJY
    Language: C++
    Result: Accepted
    Time:2004 ms
    Memory:106744 kb
     
    #include<algorithm>
    #include<iostream>
    #include<cstdlib>
    #include<cstring>
    #include<cstdio>
    #include<vector>
    #include<cmath>
    #include<stack>
    #include<queue>
    using namespace std;
     
    #define INF 0x7fffffff
    #define MAXN 3000010
     
    int n,m;
    int ans,k;
     
    struct Node
    {
        int to,next,v;
    }e[MAXN<<1];
     
    int head[MAXN];
    int dis[MAXN],q[MAXN];
     
    void link(int u,int v,int w)
    {
        k++;
        e[k].to=v;
        e[k].v=w;
        e[k].next=head[u];
        head[u]=k;
    }
     
    bool bfs()
    {
        queue<int>Q;
        int now;
        memset(dis,-1,sizeof(dis));
        Q.push(1);
        dis[1]=0;
        while (!Q.empty())
        {  
            now=Q.front();
            Q.pop();
            for (int i=head[now];i;i=e[i].next)       
            {
                if (e[i].v && dis[e[i].to]<0)
                {
                    Q.push(e[i].to);
                    dis[e[i].to]=dis[now]+1;                
                }
            }
        }
        if (dis[n*m]==-1)
            return 0;
        return 1;
    }
     
    int dfs(int x,int f)
    {
        int w,used=0;
        if (x==n*m)
            return f;
        for (int i=head[x];i;i=e[i].next)
        {
            if (e[i].v && dis[e[i].to]==dis[x]+1)
            {
                w=f-used;
                w=dfs(e[i].to,min(w,e[i].v));
                e[i].v-=w;
                e[i+1].v+=w;
                used+=w;
                if (used==f)
                    return f;
            }
        }
        if (!used)
            dis[x]=-1;
        return used;
    }
     
    void dinic()
    {
        while (bfs())
            ans+=dfs(1,INF);
    }
     
    int main()
    {
        scanf("%d%d",&n,&m);
        int x;
        for(int i=1;i<=n;i++)
            for(int j=1;j<m;j++)
            {
                scanf("%d",&x);
                link(m*(i-1)+j,m*(i-1)+j+1,x);
                link(m*(i-1)+j+1,m*(i-1)+j,x);
            }
        for(int i=1;i<n;i++)
            for(int j=1;j<=m;j++)
            {
                scanf("%d",&x);
                link(m*(i-1)+j,m*(i)+j,x);
                link(m*(i)+j,m*(i-1)+j,x);
            }
        for(int i=1;i<n;i++)
            for(int j=1;j<m;j++)
            {
                scanf("%d",&x);
                link(m*(i-1)+j,m*(i)+j+1,x);
                link(m*(i)+j+1,m*(i-1)+j,x);
            }
        dinic();
        printf("%d",ans);
        return 0;
    }
    

      

  • 相关阅读:
    科研:保持开放的心灵
    jquary实现轮播图(省略了css样式)
    Django实现注册/登录:方法2
    Django实现注册/登录:方法1
    卸载MySQL出现2503,2502解决方法
    安装MySQL出现2503,2502错误解决方法
    Markdown数学公式
    Linux安装Oracle11.2.0数据库
    Python列表生成式
    R语言apply()函数用法
  • 原文地址:https://www.cnblogs.com/yangjiyuan/p/5320366.html
Copyright © 2020-2023  润新知