题目描述

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

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

输出

输出一个整数,表示参与伏击的狼的最小数量.

题意就是割开一部分边试起点和终点不连通且割开边的边权最小,显然是最小割(转成最大流做)。但要注意的是,这里的边是双向边,所以回流边可以直接把流量赋成正向边边权,这样就不用建双向边了(就是不用建正向v流量边,反向0流量边再建反向v流量边,正向0流量边;直接建正向v流量边和反向v流量边)。这样的好处是一开始回流边就可以增广。

最后附上代码。

  1. #include<cstdio>
  2. #include<algorithm>
  3. #include<iostream>
  4. #include<cstring>
  5. #include<cmath>
  6. #include<queue>
  7. using namespace std;
  8. int next[6000001];
  9. int to[6000001];
  10. int val[6000001];
  11. int head[6000001];
  12. int tot=1;
  13. int q[6000001];
  14. int n,m;
  15. int S,T;
  16. int x;
  17. int ans;
  18. int d[6000001];
  19. const int INF=0x3f3f3f3f;
  20. void add(int x,int y,int v)
  21. {
  22. tot++;
  23. next[tot]=head[x];
  24. head[x]=tot;
  25. to[tot]=y;
  26. val[tot]=v;
  27. tot++;
  28. next[tot]=head[y];
  29. head[y]=tot;
  30. to[tot]=x;
  31. val[tot]=v;
  32. }
  33. bool bfs(int S,int T)
  34. {
  35. int r=0;
  36. int l=0;
  37. memset(d,-1,sizeof(d));
  38. q[r++]=S;
  39. d[S]=0;
  40. while(l<r)
  41. {
  42. int now=q[l];
  43. for(int i=head[now];i;i=next[i])
  44. {
  45. if(d[to[i]]==-1&&val[i]!=0)
  46. {
  47. d[to[i]]=d[now]+1;
  48. q[r++]=to[i];
  49. }
  50. }
  51. l++;
  52. }
  53. if(d[T]==-1)
  54. {
  55. return false;
  56. }
  57. else
  58. {
  59. return true;
  60. }
  61. }
  62. int dfs(int x,int flow)
  63. {
  64. if(x==T)
  65. {
  66. return flow;
  67. }
  68. int now_flow;
  69. int used=0;
  70. for(int i=head[x];i;i=next[i])
  71. {
  72. if(d[to[i]]==d[x]+1&&val[i]!=0)
  73. {
  74. now_flow=dfs(to[i],min(flow-used,val[i]));
  75. val[i]-=now_flow;
  76. val[i^1]+=now_flow;
  77. used+=now_flow;
  78. if(now_flow==flow)
  79. {
  80. return flow;
  81. }
  82. }
  83. }
  84. if(used==0)
  85. {
  86. d[x]=-1;
  87. }
  88. return used;
  89. }
  90. void dinic()
  91. {
  92. while(bfs(S,T)==true)
  93. {
  94. ans+=dfs(S,0x3f3f3f);
  95. }
  96. }
  97. int main()
  98. {
  99. scanf("%d%d",&n,&m);
  100. S=1;
  101. T=n*m;
  102. for(int i=1;i<=n;i++)
  103. {
  104. for(int j=1;j<=m-1;j++)
  105. {
  106. scanf("%d",&x);
  107. add((i-1)*m+j,(i-1)*m+j+1,x);
  108. }
  109. }
  110. for(int i=1;i<=n-1;i++)
  111. {
  112. for(int j=1;j<=m;j++)
  113. {
  114. scanf("%d",&x);
  115. add((i-1)*m+j,i*m+j,x);
  116. }
  117. }
  118. for(int i=1;i<=n-1;i++)
  119. {
  120. for(int j=1;j<=m-1;j++)
  121. {
  122. scanf("%d",&x);
  123. add((i-1)*m+j,i*m+j+1,x);
  124. }
  125. }
  126. dinic();
  127. printf("%d",ans);
  128. return 0;
  129. }

BZOJ1001[BeiJing2006]狼抓兔子——最小割的更多相关文章

  1. BZOJ1001: [BeiJing2006]狼抓兔子 [最小割 | 对偶图+spfa]

    1001: [BeiJing2006]狼抓兔子 Time Limit: 15 Sec  Memory Limit: 162 MBSubmit: 19528  Solved: 4818[Submit][ ...

  2. bzoj1001: [BeiJing2006]狼抓兔子 -- 最小割

    1001: [BeiJing2006]狼抓兔子 Time Limit: 15 Sec  Memory Limit: 162 MB Description 现在小朋友们最喜欢的"喜羊羊与灰太狼 ...

  3. BZOJ1001[BeiJing2006]狼抓兔子最小割網絡流

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

  4. BZOJ1001 [BeiJing2006]狼抓兔子 最小割 对偶图 最短路

    原文链接http://www.cnblogs.com/zhouzhendong/p/8686871.html 题目传送门 - BZOJ1001 题意 长成上面那样的网格图求最小割. $n,m\leq ...

  5. BZOJ1001: [BeiJing2006]狼抓兔子 (最小割转最短路)

    浅析最大最小定理在信息学竞赛中的应用---周东 ↑方法介绍 对于一个联通的平面图G(满足欧拉公式) 在s和t间新连一条边e; 然后建立一个原图的对偶图G*,G*中每一个点对应原图中每一个面,每一条边对 ...

  6. 【bzoj1001】[BeiJing2006]狼抓兔子 最小割+对偶图+最短路

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

  7. BZOJ 1001: [BeiJing2006]狼抓兔子 最小割

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1001 现在小朋友们最喜欢的"喜羊羊与灰太狼",话说灰太狼抓羊不到,但抓 ...

  8. [bzoj 1001][Beijing2006]狼抓兔子 (最小割+对偶图+最短路)

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

  9. bzoj1001/luogu4001 狼抓兔子 (最小割/平面图最小割转对偶图最短路)

    平面图转对偶图:先在原图中加一个s->t的边,然后对每个面建一个点,对每条分隔两个面的边加一条连接这两个面对应点的边,边权等于原边权. 然后从刚才加的s->t分割出来的两面对应的两个点跑最 ...

随机推荐

  1. vba 弹框

    '第三个按钮,上传数据到数据库 Private Sub CommandButton1_Click() str1 = "abcde" str2 = InputBox("请输 ...

  2. 【数据库摘要】10_Sql_Create_Index

    CREATE INDEX 语句 CREATE INDEX 语句用于在表中创建索引. 在不读取整个表的情况下.索引使数据库应用程序能够更快地查找数据. 索引 您能够在表中创建索引,以便更加高速高效地查询 ...

  3. Luogu4345 SHOI2015 超能粒子炮·改 Lucas、数位DP

    传送门 模数小,还是个质数,Lucas没得跑 考虑Lucas的实质.设\(a = \sum\limits_{i=0}^5 a_i 2333^i\),\(b = \sum\limits_{i=0}^5 ...

  4. Cordova套网站

    用Cordova套网站,只修改Content的话,打包后的App,在点击后会打开浏览器,并没有在App中显示内容. 需要设置allow-navigation为 * <?xml version=' ...

  5. Bootstrap Modal 使用remote从远程加载内容

        Bootstrap的Modal这个模态窗组件还是很好用的,但在开发的过程中模态窗中的内容大部分都是从后端加载的.要实现模态窗的内容是从后端加载话,常用的实现方式有2种.它们是:     (1) ...

  6. Redis对象占用内存分析

    当你往Redis中插入了一系统对象,如何分析这些对象的占用情况? 1.我们可以在Redis的控制台使用info命令来查看各项指标,其中有一项是Memory,可以通过存储前后的used_memory差异 ...

  7. 搭建SpringBoot+dubbo+zookeeper+maven框架(二)

    上一篇文章是关于搭建SpringBoot+dubbo+zookeeper+maven框架的,但是里面的功能还不够完善,今天就日志管理方面做一些改善. 下了demo的网友可能会发现项目在启动时会有警告: ...

  8. EZ 2018 06 17 NOIP2018 模拟赛(十九)

    这次的题目难得的水,但是由于许多哲学的原因,第二题题意表述很迷. 然后是真的猜题意了搞了. 不过这样都可以涨Rating我也是服了. Upt:链接莫名又消失了 A. 「NOIP2017模拟赛11.03 ...

  9. JVM规范系列第3章:为Java虚拟机编译

    Oracle 的 JDK 包括两部分内容:一部分是将 Java 源代码编译成 Java 虚拟机的指令集的编译器,另一部分是用于Java 虚拟机的运行时环境. 第一部分应该说的是 Javac 这个前置编 ...

  10. 重磅|0元学 Python运维开发,别再错过了

    51reboot 运维开发又双叒叕的搞活动了,鉴于之前 51reboot 的活动反馈,每次活动结束后(或者已经结束了很长时间)还有人在问活动的事情.这一次小编先声明一下真的不想在此次活动结束后再听到类 ...