zoukankan      html  css  js  c++  java
  • BZoj1001狼抓兔子

    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

    分析:这题明明就是一个很裸的最大流啊……但因为时间,这题不裸了,于是我挂了……说多了都是泪啊。

    放上未过代码:

    #include<iostream>
    #include<cstdio>
    #include<cstring> 
    using namespace std;
    
    
    struct edge{
      int st,en,next,v;//这图没法用邻接矩阵,果断上邻接表。 
    }map[6000005];
    
    
    const int INF=~0U>>2;
    int top=0;
    int n,m;
    int now[1000005];
    int dis[1000005],sumd[1000005];
    int pre[1000005];
    int fanhui[1000005];
    
    
    void insert(int x,int y,int w)
    {
      top++;
      map[top].st=x; map[top].en=y; map[top].v=w;
      map[top].next=now[x]; now[x]=top;
    }
    
    
    void sap()
    {
      int flow=INF,ans=0;
      bool flag=false;
      int i=1;//i表示现在枚举到的那个点 
      int all=n*m;
      dis[i]=0; sumd[0]=all;
      while (dis[1]<all)
      {
        fanhui[i]=flow;
        int key=now[i]; 
        flag=false;
    
        while (key!=0)
        {
          int nn=map[key].en;   
          if (map[key].v>0 && dis[i]==dis[nn]+1) 
          {
            flag=true;
               if (map[key].v<flow) flow=map[key].v; 
               pre[nn]=key;//pre数组记录nn连接的是哪一条边 
               i=nn;
               if (nn==n*m)
               {
                 ans+=flow;
                 while (pre[nn]!=0)
                 {
                   int kk=pre[nn];
                   int f=-1; 
                   if (map[kk].st<map[kk].en) f=1;
                   map[kk].v-=flow; map[kk+f].v+=flow;
                   nn=map[kk].st;
                 }
                 i=1;
               }
               break;
           }
           else key=map[key].next;
        }
    
        if (flag) continue;
        int mini=INF;
        key=now[i];
        while (key!=0) 
        {
          if (dis[map[key].en]<mini && map[key].v>0) mini=dis[map[key].en];
          key=map[key].next;
        }
        sumd[dis[i]]--;
        if (sumd[dis[i]]==0) break;
        dis[i]=mini+1;
        sumd[dis[i]]++;
        flow=fanhui[i];
        if (pre[i]!=0) i=map[pre[i]].st;
      } 
        cout << ans << endl;
    }
    
    int main()
    {
      memset(map,0,sizeof(map));
      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);     }   //建图成功~   sap();   return 0; }


  • 相关阅读:
    ORACLE 查看进程数,已执行任务数, 剩余任务数,删除指定任务
    ORACLE 收集统计整个用户数据
    解决Hystrix dashboard Turbine 一直 Loading…… 及其他坑
    利用 Maven 构造 Spring Cloud 微服务架构 模块使用 spring Boot构建
    AES加解密
    JAVA POI XSSFWorkbook导出扩展名为xlsx的Excel,附带weblogic 项目导出Excel文件错误的解决方案
    JAVA 文件的上传下载
    shell启停服务脚本模板
    JAVA 设计模式之 原型模式详解
    JAVA 设计模式之 工厂模式详解
  • 原文地址:https://www.cnblogs.com/Shymuel/p/4393137.html
Copyright © 2011-2022 走看看