zoukankan      html  css  js  c++  java
  • [bzoj1001]狼抓兔子解题报告(最大流最小割定理)

    现在小朋友们最喜欢的”喜羊羊与灰太狼”,话说灰太狼抓羊不到,但抓兔子还是比较在行的,而且现在的兔子还比较笨,它们只有两个窝,现在你做为狼王,面对下面这样一个网格的地形:  

    左上角点为(1,1),右下角点为(N,M)(上图中N=4,M=5).有以下三种类型的道路 1:(x,y)<==>(x+1,y) 2:(x,y)<==>(x,y+1) 3:(x,y)<==>(x+1,y+1) 道路上的权值表示这条路上最多能够通过的兔子数,道路是无向的. 左上角和右下角为兔子的两个窝,开始时所有的兔子都聚集在左上角(1,1)的窝里,现在它们要跑到右下解(N,M)的窝中去,狼王开始伏击这些兔子.当然为了保险起见,如果一条道路上最多通过的兔子数为K,狼王需要安排同样数量的K只狼,才能完全封锁这条道路,你需要帮助狼王安排一个伏击方案,使得在将兔子一网打尽的前提下,参与的狼的数量要最小。因为狼还要去找喜羊羊麻烦.

    input

    第一行为N,M.表示网格的大小,N,M均小于等于1000.接下来分三部分第一部分共N行,每行M-1个数,表示横向道路的权值. 第二部分共N-1行,每行M个数,表示纵向道路的权值. 第三部分共N-1行,每行M-1个数,表示斜向道路的权值. 输入文件保证不超过10M

    output

    输出一个整数,表示参与伏击的狼的最小数量.

    sample input

    3 4
    5 6 4
    4 3 1
    7 5 3
    5 6 7 8
    8 7 6 5
    5 5 5
    6 6 6

    sample output

    14

    人生的bzoj首杀,一道最小割模板题

    最小割在数值上等于最大流,所以输出最大流的值就行了,不多bb,直接贴代码,用的dinic算法

    #include<cstring>
    #include<cstdio>
    #include<iostream>
    using namespace std;
    int n,m;
    int ne;
    struct data{int to,next,v;}e[6000001];
    int head[1000001];
    int h[1000001],q[1000001],ans;
    void insert(int u,int v,int w)
    {
    	ne++;
    	e[ne].to=v;
    	e[ne].v=w;
    	e[ne].next=head[u];
    	head[u]=ne;
    }
    bool bfs()
    {
        int now,i;
        memset(h,-1,sizeof(h));
        int t=0,w=1;
        q[t]=1;h[1]=0;
        while(t<w)
        {   
            now=q[t];t++;
            i=head[now];
            while(i)
            {
                if(e[i].v&&h[e[i].to]<0)
                {
    				q[w++]=e[i].to;
    				h[e[i].to]=h[now]+1;                 
                }
                i=e[i].next;
            }
        }
        if(h[n*m]==-1)return 0;
        return 1;
    }
    int dfs(int x,int f)
    {
        if(x==n*m)return f;
        int i=head[x];
        int w,used=0;
        while(i)
        {
            if(e[i].v&&h[e[i].to]==h[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;
    		}
    		i=e[i].next;
    	}
    	if(!used)h[x]=-1;
    	return used;
    }
    void dinic()
    {
    	while(bfs())ans+=dfs(1,0x7fffffff);
    }
    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);
    			insert(m*(i-1)+j,m*(i-1)+j+1,x);
    			insert(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);
    			insert(m*(i-1)+j,m*(i)+j,x);
    			insert(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);
    			insert(m*(i-1)+j,m*(i)+j+1,x);
    			insert(m*(i)+j+1,m*(i-1)+j,x);
    		}
        dinic();
        printf("%d",ans);
        return 0;
    }
    
    


  • 相关阅读:
    为linux系统添加虚拟内存swap分区
    使用exec命令删除前几天产生的日志
    编写脚本:访问一网站,每5分钟访问一次,如果访问成功,将访问记录保存到日志,如果访问失败,则发送邮件至指定邮箱
    html,css学习实践总结
    css清除浮动
    bootstrap简单使用
    jquery笔记
    HTML,CSS笔记
    node学习: package.json
    node笔记
  • 原文地址:https://www.cnblogs.com/sherrlock/p/9525790.html
Copyright © 2011-2022 走看看