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

  1. 3 4
  2. 5 6 4
  3. 4 3 1
  4. 7 5 3
  5. 5 6 7 8
  6. 8 7 6 5
  7. 5 5 5
  8. 6 6 6

Sample Output

  1. 14

Solution

最小割–>網絡流水題

Dinic中的剪枝優化一定要用全. 三個優化都已經在代碼中標明.

  1. #include<cstdio>
  2. #include<cctype>
  3. #include<cstring>
  4. #include<climits>
  5. #include<algorithm>
  6. using namespace std;
  7. inline int read()
  8. {
  9. int x = 0, flag = 1;;
  10. char c;
  11. while(! isgraph(c = getchar()))
  12. if(c == '-')
  13. flag *= - 1;
  14. while(isgraph(c))
  15. x = x * 10 + c - '0', c = getchar();
  16. return x * flag;
  17. }
  18. void print(int x)
  19. {
  20. if(x < 0)
  21. putchar('-'), x *= - 1;
  22. if(x == 0)
  23. putchar('0');
  24. int ans[10], top = 0;
  25. while(x)
  26. ans[top ++] = x % 10, x /= 10;
  27. for(; top; top --)
  28. putchar(ans[top - 1] + '0');
  29. }
  30. const int oo = INT_MAX;
  31. const int MAXN = 1 << 10, MAXM = 1 << 10;
  32. int top;
  33. struct Edge
  34. {
  35. int v, flow, next;
  36. Edge(){}
  37. Edge(int v, int flow, int next): v(v), flow(flow), next(next){}
  38. }G[MAXN * MAXM << 3];
  39. int head[MAXN * MAXM];
  40. void add_edge(int u, int v, int flow)
  41. {
  42. G[top] = Edge(v, flow, head[u]);
  43. head[u] = top ++;
  44. }
  45. int Q[MAXN * MAXM];
  46. int dep[MAXN * MAXM];
  47. inline int BFS(int s, int t)
  48. {
  49. int L = 0, R = 1;
  50. Q[L] = s;
  51. memset(dep, - 1, sizeof(dep));
  52. dep[s] = 0;
  53. while(L < R)
  54. {
  55. int u = Q[L];
  56. for(int i = head[u]; i != - 1; i = G[i].next)
  57. if(dep[G[i].v] == - 1 && G[i].flow)
  58. {
  59. dep[G[i].v] = dep[u] + 1, Q[R ++] = G[i].v;
  60. if(G[i].v == t) //優化③
  61. return 1;
  62. }
  63. L ++;
  64. }
  65. return 0;
  66. }
  67. inline int DFS(int u, int flow, int t)
  68. {
  69. if(u == t)
  70. return flow;
  71. int flow_sum = 0;
  72. for(int i = head[u]; i != - 1; i = G[i].next)
  73. {
  74. int v = G[i].v;
  75. if(G[i].flow && dep[v] == dep[u] + 1)
  76. {
  77. int cur_flow = min(G[i].flow, flow - flow_sum);
  78. cur_flow = DFS(v, cur_flow, t);
  79. flow_sum += cur_flow;
  80. G[i].flow -= cur_flow;
  81. G[i ^ 1].flow += cur_flow;
  82. if(flow_sum == flow) //優化②, 也是最主要的優化
  83. return flow;
  84. }
  85. }
  86. if(! flow_sum) //優化①
  87. dep[u] = - 1;
  88. return flow_sum;
  89. }
  90. int main()
  91. {
  92. #ifndef ONLINE_JUDGE
  93. freopen("BZOJ1001.in", "r", stdin);
  94. freopen("BZOJ1001.out", "w", stdout);
  95. #endif
  96. int n = read(), m = read();
  97. top = 0;
  98. memset(head, - 1, sizeof(head));
  99. for(int i = 0; i < n; i ++)
  100. for(int j = 1; j < m; j ++)
  101. {
  102. int flow = read();
  103. add_edge(i * m + j, i * m + j - 1, flow),
  104. add_edge(i * m + j - 1, i * m + j, flow);
  105. }
  106. for(int i = 1; i < n; i ++)
  107. for(int j = 0; j < m; j ++)
  108. {
  109. int flow = read();
  110. add_edge(m * i + j, m * (i - 1) + j, flow);
  111. add_edge(m * (i - 1) + j, m * i + j, flow);
  112. }
  113. for(int i = 1; i < n; i ++)
  114. for(int j = 1; j < m; j ++)
  115. {
  116. int flow = read();
  117. add_edge(m * i + j, m * (i - 1) + j - 1, flow);
  118. add_edge(m * (i - 1) + j - 1, m * i + j, flow);
  119. }
  120. int flow = 0;
  121. while(BFS(0, n * m - 1))
  122. flow += DFS(0, oo, n * m - 1);
  123. print(flow);
  124. }

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]狼抓兔子——最小割

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

  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. Python入门学习笔记2:刷题

    1) LeetCode 强的面试题和算法题,要求也比较高,很多国内外的码农在上面刷题.难度从easy到hard都有,而且覆盖面极广,需要你的综合实力去答题. 最简单的题比如字符串的处理有的时候也要用到 ...

  2. build_mem_type_table

    该函数设置mem_types结构体数组,结构体定义如下: struct mem_type { unsigned int prot_pte;     //二级页表属性 unsigned int prot ...

  3. (转)减少oracle sql回表次数 提高SQL查询性能

    要写出高效的SQL,那么必须必须得清楚SQL执行路径,介绍如何提高SQL性能的文章很多,这里不再赘述,本人来谈谈如何从 减少SQL回表次数 来提高查询性能,因为回表将导致扫描更多的数据块. 我们大家都 ...

  4. hdu2604 递推转换矩阵快速幂

    刚开始还以为用位运算与或几下几个循环就搞定了,算着算着发现不行........ 还是一种固定的切题角度,我假设有长度为n,总的排列数位f(n),怎么算他呢?从后往前考虑,因为大多数情况,都是用前面的结 ...

  5. Selenium WebDriver-打开3个网址截图,文件夹用年月日命名,图片用当前时分秒命名

    import os import os.path import time from selenium import webdriver urls=["http://www.baidu.com ...

  6. day01_14.遍历数组

    <?php $a = array('a','b','c'); print_r($a); ?> 输出结果:Array ( [0] => a [1] => b [2] => ...

  7. Redis 使用多个数据库及密码配置

    redis的默认端口是6379,可以使用的数据库最多有16个,不同数据库之间是独立的, 可以通过 select num 的方式访问不同的数据库 可以通过下面的命令来切换到不同的数据库下,每个数据库都有 ...

  8. 80x86保护模式下IDT和中断调用过程分析

    80x86保护模式下IDT和中断调用过程分析 1.中断描述符表(IDT),将每个异常或中断向量分别与它们的处理过程联系起来.与GDT和LDT类似,IDT也是由8字节长度的描述符组成.IDT空描述符的存 ...

  9. GCC内嵌汇编一些限制字符串

    /******************/ “b”将输入变量放入ebx “c”将输入变量放入ecx “d”将输入变量放入edx “s”将输入变量放入esi “d”将输入变量放入edi “q”将输入变量放 ...

  10. struts转换器详解

    struts转换器:在B/S应用中,将字符串请求参数转换为相应的数据类型,是MVC框架提供的功能,而Struts2是很好的MVC框架实现者,理所当然,提供了类型转换机制. 一.类型转换的意义 对于一个 ...