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

    1001: [BeiJing2006]狼抓兔子

    Time Limit: 15 Sec  Memory Limit: 162 MB
    Submit: 31419  Solved: 8378
    [Submit][Status][Discuss]

    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
     
    最小割裸题,打算以后用dinic模板,不用ISPA了。被卡了再换。
    对基本的dinic模板,有点理解。还需要深入理解。
     
    思路,直接连边即可。从1到n*m跑最大流。
     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 const int inf=0x3f3f3f3f;
     4 int n,m;
     5 int cnt;
     6 struct data{
     7     int to,next,w;
     8 }edge[6000010];
     9 int head[1000010];
    10 int h[1000010],ans;
    11 
    12 void add(int u,int v,int w) {
    13     cnt++;
    14     edge[cnt].to=v;
    15     edge[cnt].w=w;
    16     edge[cnt].next=head[u];
    17     head[u]=cnt;
    18 }
    19 
    20 bool bfs() {
    21     int now,i;
    22     memset(h,-1,sizeof(h));
    23     queue<int> q;
    24     q.push(1);
    25     h[1]=0;
    26     while(!q.empty()) {
    27         now=q.front();
    28         q.pop();
    29         i=head[now];
    30         while(i) {
    31             if(edge[i].w&&h[edge[i].to]<0) {
    32                 q.push(edge[i].to);
    33                 h[edge[i].to]=h[now]+1;
    34             }
    35             i=edge[i].next;
    36         }
    37     }
    38     if(h[n*m]==-1) return 0;
    39     return 1;
    40 }
    41 
    42 int dfs(int x,int f) {
    43     if(x==n*m) return f;
    44     int i=head[x];
    45     int w,used=0;
    46     while(i) {
    47         if(edge[i].w&&h[edge[i].to]==h[x]+1) {
    48             w=f-used;
    49             w=dfs(edge[i].to,min(w,edge[i].w));
    50             edge[i].w-=w;
    51             edge[i+1].w+=w;
    52             used+=w;
    53             if(used==f) return f;
    54         }
    55         i=edge[i].next;
    56     }
    57     if(!used) h[x]=-1;
    58     return used;
    59 }
    60 
    61 void dinic() {
    62     while(bfs()) ans+=dfs(1,inf);
    63 }
    64 
    65 int main() {
    66     while(~scanf("%d%d",&n,&m)) {
    67         cnt=0;
    68         ans=0;
    69         memset(head,0,sizeof(head));
    70         for(int i=1;i<=n;i++) {
    71             for(int j=1;j<m;j++) {
    72                 int w;
    73                 scanf("%d",&w);
    74                 add(m*(i-1)+j,m*(i-1)+j+1,w);
    75                 add(m*(i-1)+j+1,m*(i-1)+j,w);
    76             }
    77         }
    78         for(int i=1;i<n;i++) {
    79             for(int j=1;j<=m;j++) {
    80                 int w;
    81                 scanf("%d",&w);
    82                 add(m*(i-1)+j,m*i+j,w);
    83                 add(m*i+j,m*(i-1)+j,w);
    84             }
    85         }
    86         for(int i=1;i<n;i++) {
    87             for(int j=1;j<m;j++) {
    88                 int w;
    89                 scanf("%d",&w);
    90                 add(m*(i-1)+j,m*i+j+1,w);
    91                 add(m*i+j+1,m*(i-1)+j,w);
    92             }
    93         }
    94         dinic();
    95         printf("%d
    ",ans);
    96     }
    97     return 0;
    98 }
    View Code

    另外一种解法——————对偶图

    可以把平面图最大流问题转化为最短路问题。

    首先明白转化过程。周冬《两极相通——浅析最大—最小定理在信息学竞赛中的应用》

  • 相关阅读:
    linux 系统层/用户层资源使用信息监控
    人工神经网络学习
    刷题
    使用机器学习进行气象数据分析
    kaggle 从零开始记录遇到的问题
    大数据平台资料收集
    MacOS应用cocoa application问题
    Latex学习手记(持续更新)
    Matplotlib折线图
    Android的系统架构——安卓运行库
  • 原文地址:https://www.cnblogs.com/ACMerszl/p/10952844.html
Copyright © 2011-2022 走看看