zoukankan      html  css  js  c++  java
  • 【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;
    }
    

      

  • 相关阅读:
    CentOS6.5 mini安装到VirtualBox虚拟机中
    docker配置redis6.0.5集群
    docker搭建数据库高可用方案PXC
    我通过调试ConcurrentLinkedQueue发现一个IDEA的小虫子(bug), vscode复现, eclipse毫无问题
    ThreadLocal底层原理学习
    第九章
    多线程-java并发编程实战笔记
    Spring-IOC源码解读3-依赖注入
    Spring-IOC源码解读2.3-BeanDefinition的注册
    Spring-IOC源码解读2.2-BeanDefinition的载入和解析过程
  • 原文地址:https://www.cnblogs.com/yangjiyuan/p/5320366.html
Copyright © 2011-2022 走看看