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

左上角点为(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只狼,
才能完全封锁这条道路,你需要帮助狼王安排一个伏击方案,使得在将兔子一网打尽的前提下,参与的
狼的数量要最小。因为狼还要去找喜羊羊麻烦.

Sample Output14

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
 
题意 : 题目是让求一个最小割,而最小割等于最大流,因此直接跑一个 dicnic 就可以了
代码示例 :
  1. using namespace std;
  2. #define ll long long
  3. const int maxn = 1e6+5;
  4. const int mod = 1e9+7;
  5. const double eps = 1e-9;
  6. const double pi = acos(-1.0);
  7. const int inf = 0x3f3f3f3f;
  8.  
  9. int read() { //输入挂
  10. int x = 0, f = 1; register char ch = getchar();
  11. while (ch<'0' || ch>'9') { if (ch == '-')f = -1; ch = getchar(); }
  12. while (ch >= '0'&&ch <= '9') { x = x * 10 + ch - '0'; ch = getchar(); }
  13. return x*f;
  14. }
  15.  
  16. int n, m;
  17. struct node
  18. {
  19. int to, flow, next;
  20. }edge[6*maxn];
  21. int head[maxn];
  22. int cnt = 0;
  23.  
  24. void addedge(int u, int v, int w){
  25. edge[cnt].next = head[u], edge[cnt].to = v, edge[cnt].flow = w, head[u] = cnt++;
  26. edge[cnt].next = head[v], edge[cnt].to = u, edge[cnt].flow = w, head[v] = cnt++;
  27. }
  28.  
  29. int deep[maxn], que[maxn];
  30. bool bfs(int s, int t){
  31. int head1 = 0, tail1 = 1;
  32. memset(deep, 0, sizeof(deep));
  33. que[0] = s; deep[s] = 1;
  34.  
  35. while(head1 < tail1){
  36. int u = que[head1++];
  37. for(int i = head[u]; i != -1; i = edge[i].next){
  38. int v = edge[i].to;
  39. if (!deep[v] && edge[i].flow) {
  40. deep[v] = deep[u]+1;
  41. que[tail1++] = v;
  42. }
  43. }
  44. }
  45. return deep[t];
  46. }
  47.  
  48. int dfs(int u, int f1){
  49. if (u == n*m || f1 == 0) return f1; // !!!!!
  50.  
  51. int f = 0;
  52. for(int i = head[u]; i != -1; i = edge[i].next){
  53. int v = edge[i].to;
  54. if (edge[i].flow && deep[v] == deep[u]+1){
  55. int x = dfs(v, min(f1, edge[i].flow));
  56. edge[i].flow -= x; edge[i^1].flow += x;
  57. f1 -= x, f += x;
  58. if (f1 == 0) return f;
  59. }
  60. }
  61. if (!f) deep[u] = -2;
  62. return f;
  63. }
  64.  
  65. void solve() {
  66.  
  67. int res = 0;
  68. while(bfs(1, n*m)) {
  69. res += dfs(1, inf);
  70. }
  71. cout << res << endl;
  72. }
  73.  
  74. int main() {
  75. n = read(), m = read();
  76.  
  77. int i = 1, j = 2;
  78. int x;
  79. memset(head, -1, sizeof(head));
  80. for(int k = 1; k <= n*m; k++){
  81. if (i%m == 0) {i++, j++; continue;}
  82. x = read();
  83. addedge(i, j, x);
  84. i++, j++;
  85. }
  86. i = 1, j = 1+m;
  87. for(int k = 1; k <= (n-1)*m; k++){
  88. x = read();
  89. addedge(i, j, x);
  90. i++, j++;
  91. }
  92. i = 1, j = 2+m;
  93. for(int k = 1; k <= (n-1)*m; k++){
  94. if (i%m == 0) {i++, j++; continue;}
  95. x = read();
  96. addedge(i, j, x);
  97. i++, j++;
  98. }
  99. solve();
  100. return 0;
  101. }

网络流入门题目 - bzoj 1001的更多相关文章

  1. BZOJ 1001 [BeiJing2006] 狼抓兔子(平面图最大流)

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

  2. nyoj_323:Drainage Ditches(网络流入门)

    题目链接 网络流入门@_@,此处本人用的刘汝佳的Dinic模板 #include<bits/stdc++.h> using namespace std; const int INF = 0 ...

  3. 网络流入门-POJ1459PowerNetwork-Dinic模板

    (我有什么错误或者你有什么意见,欢迎留言或私聊!谢谢!) (Ps:以前听说过网络流,想着以后再学,这次中南多校赛也碰到有关网络流的题目,想着这两天试着学学这个吧~~ 这是本人网络流入门第二题,不知道怎 ...

  4. Tile Cut~网络流入门题

    Description When Frodo, Sam, Merry, and Pippin are at the Green Dragon Inn drinking ale, they like t ...

  5. 草地排水 洛谷P2740 最大流 入门题目

    草地排水 洛谷P2740 最大流入门题目 题意 在农夫约翰的农场上,每逢下雨,贝茜最喜欢的三叶草地就积聚了一潭水.这意味着草地被水淹没了,并且小草要继续生长还要花相当长一段时间.因此,农夫约翰修建了一 ...

  6. s - t 平面图最大流 (附例题 bzoj 1001)

    以下均移自 周冬的<两极相通-浅析最大最小定理在信息学竞赛中的应用> 平面图性质 1.(欧拉公式)如果一个连通的平面图有n个点,m条边和f个面,那么f=m-n+2 2.每个平面图G都有一个 ...

  7. poj 2186 强连通入门题目

    每头牛的梦想就是成为牛群中最受欢迎的牛. 在一群N(1 <= N <= 10,000)母牛中, 你可以得到M(1 <= M <= 50,000)有序的形式对(A,B),告诉你母 ...

  8. 树形DP入门题目推荐以及解析

    关于树形DP几道入门题目 今天恶补树形DP,感觉海星. 其实挺简单的. 介绍几道例题,我会的. 1.洛谷P1352 没有上司的舞会 我的一篇题解 我们可以考虑每一个节点都是有两种情况. 一个是被邀请: ...

  9. BZOJ 1001 狼抓兔子 (网络流最小割/平面图的对偶图的最短路)

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1001 算法讨论: 1.可以用最大流做,最大流等于最小割. 2.可以把这个图转化其对偶图,然 ...

随机推荐

  1. Laravel5.3使用学习笔记---中间件

    Laravel提供了中间件的使用.那什么是中间件呢,根据用法,我总结为,夹在“请求—>控制器—>响应—>end”中间运行的代码片段.本文将以官方英文文本为基础资料进行笔记记录. La ...

  2. Intellij IDEA 如何使用Jrebel热部署

    My Jrebel 已经不再提供免费使用了,或使用破解版Jrebel 或可以移步至 HotSwapAgent,或使用破解的Jrebel. 一个java web项目,在写的过程中我们需要不断调试,如果没 ...

  3. P1022 绵羊排序

    题目描述 聪聪想要给他家农场里的 \(n\) 只绵羊按照品质从高到低进行排序. 农场里的 \(n\) 只绵羊编号从 \(1\) 到 \(n\) ,第 \(i\) 只绵羊的体重为 \(w_i\) ,高度 ...

  4. Vue与React比较

    与React 相似: (1)虚拟DOM(Virtual DOM) 虚拟DOM的诞生是基于:改变真实的DOM状态远比改变一个JS对象的花销要大的多. 虚拟DOM是一个映射真实DOM的JS对象,当有变化产 ...

  5. 【t081】序列长度

    Time Limit: 1 second Memory Limit: 128 MB [问题描述] 有一个整数序列,我们不知道她的长度是多少(即序列中整数的个数),但我们知道在某些区间中至少有多少个整数 ...

  6. JUnit 单元测试断言推荐 AssertJ

    文章转自:http://sgq0085.iteye.com/blog/2030609 前言 由于JUnit的Assert是公认的烂API,所以不推荐使用,目前推荐使用的是AssertJ. Assert ...

  7. 2018-11-5-win10-uwp-异步转同步

    title author date CreateTime categories win10 uwp 异步转同步 lindexi 2018-11-05 10:18:40 +0800 2018-2-13 ...

  8. Cisco DNA-C POC环境配置

    Step1:在DNA-C上创建Site,本例创建Global->China->WangJiang->20 F如下图: Step2:配置fusion区域的AAA和NTP等信息,如下图: ...

  9. 修改Samba密码后无法登录

    Samba修改用户名密码后,无法登陆 之后每次进去都是以这样的username和passwd进去的,如何才能使用其他的用户来重新登录samba server呢? 首先使用在开始菜单里面输入cmd: 进 ...

  10. lambda应用

    def test(a, b, func): result = func(a, b) print(result) test(10, 15, lambda x, y: x + y) #coding=utf ...