zoukankan      html  css  js  c++  java
  • B1001 狼抓兔子 最小割

    题目描述
    现在小朋友们最喜欢的"喜羊羊与灰太狼",话说灰太狼抓羊不到,但抓兔子还是比较在行的,
    而且现在的兔子还比较笨,它们只有两个窝,现在你做为狼王,面对下面这样一个网格的地形:
     
    
    左上角点为(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只狼,
    才能完全封锁这条道路,你需要帮助狼王安排一个伏击方案,使得在将兔子一网打尽的前提下,参与的
    狼的数量要最小。因为狼还要去找喜羊羊麻烦.
    输入格式
    第一行为N,M.表示网格的大小,N,M均小于等于1000.
    接下来分三部分
    第一部分共N行,每行M-1个数,表示横向道路的权值. 
    第二部分共N-1行,每行M个数,表示纵向道路的权值. 
    第三部分共N-1行,每行M-1个数,表示斜向道路的权值. 
    输入文件保证不超过10M
    输出格式
    输出一个整数,表示参与伏击的狼的最小数量.
    
    样例输入
    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
    样例输出
    14

    这个题一看就是最小割板子,建边也很好建,但是我竟然忘了初始化。。。

    还有,网络流存无向边只需要把两个边都变成w权值,而不是建四条边(虽然也能过,但是内存大一倍)

    直接上代码:

    #include<iostream>
    #include<cstdio>
    #include<algorithm>
    #include<queue>
    #include<cstring>
    using namespace std;
    #define duke(i,a,n) for(int i = a;i <= n;i++)
    #define lv(i,a,n) for(int i = a;i >= n;i++)
    #define clean(a) memset(a,0,sizeof(a));
    #define inf 99999999
    template <class T>
    void read(T &x)
    {
        char c;
        bool op = 0;
        while(c = getchar(),c > '9' || c < '0')
            if(c == '-') op = 1;
        x = c - '0';
        while(c = getchar(),c >= '0' && c <= '9')
            x = x * 10 + c - '0';
        if(op == 1)
            x = -x;
    }
    struct node{
        int x,y,w,nxt,other;
    }a[6000100];
    int lst[1000010],len = 0;
    int st,ed;
    void add(int x,int y,int w)
    {
        int k1,k2;
        a[++len].x = x;
        a[len].y = y;
        a[len].w = w;
        a[len].nxt = lst[x];
        k1 = len;
        lst[x] = len;
        a[++len].x = y;
        a[len].y = x;
        a[len].w = w;
        a[len].nxt = lst[y];
        lst[y] = len;
        k2 = len;
        a[k1].other = k2;
        a[k2].other = k1;
    }
    int n,m,h[1000010],qu[1000010],head = 1,tail = 2;
    bool bfs()
    {
        clean(h);
        h[st] = 1;
        head = 1;
        qu[head] = st;
        tail = 2;
        while(head != tail)
        {
            int x = qu[head];
            for(int k = lst[x];k;k = a[k].nxt)
            {
                int y = a[k].y;
                if(a[k].w > 0 && h[y] == 0)
                {
                    h[y] = h[x] + 1;
                    qu[tail++] = y;
                }
            }
            head++;
        }
        if(h[ed] > 0)
        return true;
        else
        return false;
    }
    int find(int x,int f)
    {
        if(x == ed)
        {
            return f;
        }
        int s = 0,t;
        for(int k = lst[x];k;k = a[k].nxt)
        {
            int y = a[k].y;
            if(s < f && h[y] == (h[x] + 1) && a[k].w > 0)
            {
                t = find(y,min(a[k].w,f - s));
                s += t;
                a[k].w -= t;
                a[a[k].other].w += t;
            }
        }
        if(s == 0)
        h[x] = 0;
        return s;
    }
    int main()
    {
        int x,l,r;
        read(n);read(m);
        duke(i,1,n)
        {
            duke(j,1,m - 1)
            {
                read(x);
                l = (i - 1) * m + j;
                r = (i - 1) * m + j + 1;
                add(l,r,x);
            }
        }
        duke(i,1,n - 1)
        {
            duke(j,1,m)
            {
                read(x);
                l = (i - 1) * m + j;
                r = i * m + j;
                add(l,r,x);
            }
        }
        duke(i,1,n - 1)
        {
            duke(j,1,m - 1)
            {
                read(x);
                l = (i - 1) * m + j;
                r = i * m + j + 1;
                add(l,r,x);
            }
        }
        st = 1;
        ed = n * m;
        int ans = 0;
        while(bfs() == true)
        {
            ans += find(st,999999999);
        }
        printf("%d
    ",ans);
        return 0;
    }
  • 相关阅读:
    yii2 gii 命令行自动生成控制器和模型
    控制器中的方法命名规范
    Vue Property or method "" is not defined on the instance but referenced during render. Make sure that this property is reactive, either in the data option, or for class-based
    IDEA插件:GsonFormat
    Spring Boot : Access denied for user ''@'localhost' (using password: NO)
    Typora添加主题
    Git基础命令图解
    Java Joda-Time 处理时间工具类(JDK1.7以上)
    Java日期工具类(基于JDK1.7版本)
    Oracle SQL Developer 连接Oracle出现【 状态: 失败 -测试失败: ORA-01017: invalid username/password; logon denied】
  • 原文地址:https://www.cnblogs.com/DukeLv/p/9479700.html
Copyright © 2011-2022 走看看