zoukankan      html  css  js  c++  java
  • [BeiJing2006]狼抓兔子

    bzoj 1001: [BeiJing2006]狼抓兔子

    http://www.lydsy.com/JudgeOnline/problem.php?id=1001

    Time Limit: 15 Sec  Memory Limit: 162 MB

    Description

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

     

    左上角点为(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

    HINT

     2015.4.16新加数据一组,可能会卡掉从前可以过的程序。

    法1、平面图转对偶图求最小割 2128 ms

    #include<cstdio>
    #include<queue>
    #include<cstring>
    #define N 3000010
    #define M 9000150
    using namespace std;
    int n,m,ans,tot;
    int src,dec,next[M],to[M],front[N],cap[M];
    long long DIS[N];
    struct edge
    {
        int number;
        long long dis;
        bool operator <(edge b) const
        {
            return dis>b.dis;
        }
    };
    priority_queue<edge>q;
    void add(int u,int v,int w)
    {
        to[++tot]=v;next[tot]=front[u];front[u]=tot;cap[tot]=w;
    }
    bool dijkstra()
    {
        for(int i=1;i<=dec;i++) DIS[i]=2e9;
        q.push((edge){0,0});
        while(!q.empty())
        {
            edge now=q.top();q.pop();
            if(DIS[now.number]!=now.dis) continue;
            for(int i=front[now.number];i;i=next[i])
            {
                if(DIS[to[i]]>DIS[now.number]+1ll*cap[i])
                {
                    DIS[to[i]]=DIS[now.number]+1ll*cap[i];
                    q.push((edge){to[i],DIS[to[i]]});
                }
            }
        }
        printf("%d
    ",DIS[dec]);
    }
    int main()
    {
            scanf("%d%d",&n,&m);
            int x,l=2*m;
            for(int i=1;i<=n;i++)
             for(int j=1;j<m;j++)
              {
                  scanf("%d",&x);
                  add((i-1)*l+1+(j-1)*2+1,(i-1)*l+1+(j-1)*2+1+l+1,x);
                add((i-1)*l+1+(j-1)*2+1+l+1,(i-1)*l+1+(j-1)*2+1,x);          
              }
            for(int i=1;i<n;i++)
             for(int j=1;j<=m;j++)
             {
                 scanf("%d",&x);
                 add(i*l+(j-1)*2+1,i*l+(j-1)*2+1+1,x);
                 add(i*l+(j-1)*2+1+1,i*l+(j-1)*2+1,x);
             }
            for(int i=1;i<n;i++)
             for(int j=1;j<m;j++)
              {
                  scanf("%d",&x);
                  add(i*l+j*2,i*l+j*2+1,x);
                  add(i*l+j*2+1,i*l+j*2,x);
              }
            dec=(n+1)*l;
            for(int i=l+1;i+l<=dec;i+=l)  add(src,i,0);
            for(int i=n*l+1;i<dec;i++) add(src,i,0);
            for(int i=2;i<l;i+=2) add(i,dec,0);
            for(int i=2*l;i+l<=dec;i+=l) add(i,dec,0);
            dijkstra();
        
        return 0;
    }
    View Code

    法2、直接跑最大流  2120 ms

    注意是无向图,所以不建反向弧

    #include<cstdio>
    #include<queue>
    #include<cstring>
    #define N 1000010
    #define M 9000150
    using namespace std;
    int n,m,ans,tot=1;
    int src,decc,nextt[M],to[M],front[N],cap[M],lev[N],cur[N];
    queue<int>q;
    void add(int u,int v,int w)
    {
        to[++tot]=v;nextt[tot]=front[u];front[u]=tot;cap[tot]=w;
        to[++tot]=u;nextt[tot]=front[v];front[v]=tot;cap[tot]=w;
    }
    bool bfs() 
    { 
        for(int i=0;i<=decc;i++) {cur[i]=front[i];lev[i]=-1;} 
        while(!q.empty()) q.pop(); 
        q.push(src);lev[src]=0; 
        while(!q.empty()) 
        { 
            int now=q.front();q.pop(); 
            for(int i=front[now];i!=0;i=nextt[i]) 
            { 
                int t=to[i]; 
                if(cap[i]>0&&lev[t]==-1) 
                { 
                    q.push(t); 
                    lev[t]=lev[now]+1; 
                    if(t==decc) return true; 
                } 
            } 
        } 
        return false; 
    } 
    int dinic(int now,int flow) 
    { 
        if(now==decc) return flow; 
        int delta,rest=0; 
        for(int & i=cur[now];i!=0;i=nextt[i]) 
        { 
            int t=to[i]; 
            if(lev[t]==lev[now]+1&&cap[i]>0) 
            { 
                delta=dinic(t,min(cap[i],flow-rest)); 
                if(delta) 
                { 
                    cap[i]-=delta;cap[i^1]+=delta; 
                    rest+=delta;if(rest==flow) break; 
                } 
            } 
        } 
        if(rest!=flow) lev[now]=-1; 
        return rest; 
    } 
    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);
                add((i-1)*m+j,(i-1)*m+j+1,x);
              }
            for(int i=1;i<n;i++)
             for(int j=1;j<=m;j++)
             {
                scanf("%d",&x);
                add((i-1)*m+j,i*m+j,x);
             }
            for(int i=1;i<n;i++)
             for(int j=1;j<m;j++)
              {
                scanf("%d",&x);
                add((i-1)*m+j,i*m+j+1,x);
              }
            decc=n*m+1;
            add(src,1,0x7fffffff);add(n*m,decc,0x7fffffff);
            while(bfs()) 
             ans+=dinic(src,0x7fffffff);
            printf("%d",ans);
         
        return 0;
    }
    View Code
  • 相关阅读:
    基本技能训练之线程
    关于UEditor的使用配置(图片上传配置)
    PAT 乙级练习题1002. 写出这个数 (20)
    codeforces 682C Alyona and the Tree DFS
    codeforces 681D Gifts by the List dfs+构造
    codeforces 678E Another Sith Tournament 概率dp
    codeforces 680E Bear and Square Grid 巧妙暴力
    codeforces 678D Iterated Linear Function 矩阵快速幂
    codeforces 679A Bear and Prime 100 交互
    XTUOJ 1248 TC or CF 搜索
  • 原文地址:https://www.cnblogs.com/TheRoadToTheGold/p/6505581.html
Copyright © 2011-2022 走看看