码迷,mamicode.com
首页 > 其他好文 > 详细

BZOJ 1001 狼抓兔子

时间:2016-06-12 12:21:16      阅读:145      评论:0      收藏:0      [点我收藏+]

标签:

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

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

 技术分享

左上角点为(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只狼,
才能完全封锁这条道路,你需要帮助狼王安排一个伏击方案,使得在将兔子一网打尽的前提下,参与的
狼的数量要最小。因为狼还要去找喜羊羊麻烦.
 
思路:dinic网络流居然过了。。
据说正解是什么对偶图
 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<cmath>
 5 #include<string>
 6 #include<algorithm>
 7 int next[7000005],first[7000005],go[7000005],tot,val[7000005];
 8 int dis[2000005],c[5000005],S,T,n,m,x,ans=0;
 9 
10 int sta(int x,int y){
11     return (x-1)*m+y;
12 }
13 void insert(int x,int y,int z){
14     tot++;
15     go[tot]=y;
16     next[tot]=first[x];
17     first[x]=tot;
18     val[tot]=z;
19     
20     tot++;
21     go[tot]=x;
22     next[tot]=first[y];
23     first[y]=tot;
24     val[tot]=z;
25 }
26 bool bfs(){
27     int now,i;
28     memset(dis,-1,sizeof dis);
29     int h=0,t=1;
30     c[1]=S;
31     dis[S]=0;
32     while (h<t){
33         h++;
34         now=c[h];
35         for (int i=first[now];i;i=next[i]){
36             int pur=go[i];
37             if (val[i]&&dis[pur]<0){
38                 c[++t]=pur;
39                 dis[pur]=dis[now]+1;
40             }
41         }
42     }
43     if (dis[T]==-1) return 0;
44     return 1;
45 }
46 int dfs(int x,int f){
47     if (x==T) return f;
48     int w,used=0;
49     for (int i=first[x];i;i=next[i]){
50         int pur=go[i];
51         if (val[i]&&dis[pur]==dis[x]+1){
52             w=f-used;
53             w=dfs(pur,std::min(w,val[i]));
54             val[i]-=w;
55             val[i+1]+=w;
56             used+=w;
57             if (used==f) return f;
58         }
59     }
60     if (!used) dis[x]=-1;
61     return used;
62 }
63 void dinic(){
64     while (bfs()) ans+=dfs(1,0x7fffffff);
65 }
66 int main(){
67     scanf("%d%d",&n,&m);
68     S=1;T=sta(n,m);
69     for (int i=1;i<=n;i++)
70      for (int j=1;j<=m-1;j++){
71          scanf("%d",&x);
72          insert(sta(i,j),sta(i,j+1),x);
73      }
74     for (int i=1;i<=n-1;i++)
75      for (int j=1;j<=m;j++){
76          scanf("%d",&x);
77          insert(sta(i,j),sta(i+1,j),x);
78      } 
79     for (int i=1;i<=n-1;i++)
80      for (int j=1;j<=m-1;j++){
81          scanf("%d",&x);
82          insert(sta(i,j),sta(i+1,j+1),x);
83      } 
84     dinic();
85     printf("%d",ans); 
86 }

 

BZOJ 1001 狼抓兔子

标签:

原文地址:http://www.cnblogs.com/qzqzgfy/p/5577060.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!