题目链接:戳我

按理说以dinic\(O(M*N^2)\)的时间复杂度应该是过不去的(呃我也知道这个上界很松)。但是最小割确实可以水过去??

但是本着写正解的精神,我还是学了学平面图和对偶图,跑最短路的话时间复杂度应该是正确的。(大家可以去上网搜一下,或者看蒟蒻的OI网络流 简单学习笔记

所以就。。。建图呗。这种题最难的不就是建图嘛。

建议大家画一个图(图的范例比如说ljh dalao的这张qwq

具体细节可以看代码。

注意n=1或者m=1的情况要特判。

然后因为点的上限(n-1)(m-1)*2+1,所以空间一定注意要开够qwqwq

代码如下:

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstring>
  4. #include<algorithm>
  5. #include<queue>
  6. #define S 0
  7. #define T (n-1)*(m-1)*2+1
  8. #define MAXN 4000010
  9. using namespace std;
  10. int n,m,t,cur;
  11. int dis[MAXN],done[MAXN],head[MAXN];
  12. struct Node
  13. {
  14. int u,d;
  15. friend bool operator <(struct Node x,struct Node y)
  16. {return x.d>y.d;}
  17. };
  18. struct Edge{int nxt,to,dis;}edge[MAXN<<1];
  19. inline void add(int from,int to,int dis)
  20. {
  21. edge[++t].nxt=head[from],edge[t].to=to,edge[t].dis=dis,head[from]=t;
  22. edge[++t].nxt=head[to],edge[t].to=from,edge[t].dis=dis,head[to]=t;
  23. }
  24. inline void dij()
  25. {
  26. priority_queue<Node>q;
  27. memset(dis,0x3f,sizeof(dis));
  28. memset(done,0,sizeof(done));
  29. q.push((Node){S,0});dis[S]=0;
  30. while(!q.empty())
  31. {
  32. int u=q.top().u; q.pop();
  33. if(done[u]) continue;
  34. done[u]=1;
  35. for(int i=head[u];i;i=edge[i].nxt)
  36. {
  37. int v=edge[i].to;
  38. if(dis[u]+edge[i].dis<dis[v])
  39. dis[v]=dis[u]+edge[i].dis,q.push((Node){v,dis[v]});
  40. }
  41. }
  42. }
  43. int main()
  44. {
  45. #ifndef ONLINE_JUDGE
  46. freopen("ce.in","r",stdin);
  47. #endif
  48. scanf("%d%d",&n,&m);
  49. if(n==1)
  50. {
  51. int minn=2147483647,cur;
  52. for(int i=1;i<m;i++)
  53. scanf("%d",&cur),minn=min(minn,cur);
  54. printf("%d\n",minn);
  55. return 0;
  56. }
  57. if(m==1)
  58. {
  59. int minn=2147483647,cur;
  60. for(int i=1;i<n;i++)
  61. scanf("%d",&cur),minn=min(minn,cur);
  62. printf("%d\n",minn);
  63. return 0;
  64. }
  65. for(int i=1;i<=2*(n-1)+1;i+=2)
  66. for(int j=1;j<m;j++)
  67. {
  68. scanf("%d",&cur);
  69. if(i==1) add(S,j,cur);
  70. else if(i==2*(n-1)+1) add((i-2)*(m-1)+j,T,cur);
  71. else add((i-2)*(m-1)+j,(i-1)*(m-1)+j,cur);
  72. }
  73. for(int i=1;i<2*(n-1)+1;i+=2)
  74. for(int j=1;j<=m;j++)
  75. {
  76. scanf("%d",&cur);
  77. if(j==1) add(i*(m-1)+1,T,cur);
  78. else if(j==m) add(S,(i-1)*(m-1)+m-1,cur);
  79. else add((i-1)*(m-1)+j-1,i*(m-1)+j,cur);
  80. }
  81. for(int i=1;i<2*(n-1)+1;i+=2)
  82. for(int j=1;j<m;j++)
  83. {
  84. scanf("%d",&cur);
  85. add((i-1)*(m-1)+j,i*(m-1)+j,cur);
  86. }
  87. dij();
  88. printf("%d\n",dis[T]);
  89. return 0;
  90. }

[BJ2006] 狼抓兔子的更多相关文章

  1. BZOJ 1001: [BeiJing2006]狼抓兔子

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

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

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

  3. 【BZOJ1001】狼抓兔子

    1001: [BeiJing2006]狼抓兔子 Time Limit: 15 Sec  Memory Limit: 162 MBSubmit: 7530  Solved: 1724[Submit][S ...

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

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

  5. BZOJ-1001 狼抓兔子 (最小割-最大流)平面图转对偶图+SPFA

    1001: [BeiJing2006]狼抓兔子 Time Limit: 15 Sec Memory Limit: 162 MB Submit: 14686 Solved: 3513 [Submit][ ...

  6. 【BZOJ】【1001】 【BJOI2006】狼抓兔子

    平面图最小割->对偶图最短路 平面图最小割转对偶图最短路= = 想到了就比较好写了…… 可能是我对区域的标号方式比较奇特?反正我没有特判n==1||m==1也能过2333(机智吧-(滚开啦你个自 ...

  7. 【BZOJ】1001: [BeiJing2006]狼抓兔子 Dinic算法求解平面图对偶图-最小割

    1001: [BeiJing2006]狼抓兔子 Description 左上角点为(1,1),右下角点为(N,M)(上图中N=4,M=5).有以下 三种类型的道路 1:(x,y)<==>( ...

  8. BZOJ_1001_狼抓兔子_(平面图求最小割+对偶图求最短路)

    描述 http://www.lydsy.com/JudgeOnline/problem.php?id=1001 1001: [BeiJing2006]狼抓兔子 Time Limit: 15 Sec   ...

  9. BJOI2006狼抓兔子

    1001: [BeiJing2006]狼抓兔子 Time Limit: 15 Sec  Memory Limit: 162 MBSubmit: 9967  Solved: 2267[Submit][S ...

随机推荐

  1. (halcon) derivate_vector_field

    derivate_vector_field: Convolve a vector field with derivatives of the Gaussian 用高斯导数卷积向量场 derivate_ ...

  2. Javascript —— 有向图广度优先搜索

    用Javascript实现有向图的广度优先搜索 刚好遇到一个需求,对于一个有向图,指定一个节点 i 作为起点,输出从 i 出发,可以到达的所有节点,也就是图中以 i 作为起点的子连通片,思考了一下,可 ...

  3. SQLSERVER 建立全文检索

    --  创建测试表 --  DROP TABLE FullTextIndexing CREATE TABLE FullTextIndexing ( ID INT IDENTITY(1,1) NOT N ...

  4. [hdu4347]The Closest M Points(平衡树式kdtree)

    解题关键:模板题(结合起来了) #include<iostream> #include<cstdio> #include<cstring> #include< ...

  5. Opencv 图像矩

    #include <iostream>#include <opencv2/opencv.hpp> using namespace std;using namespace cv; ...

  6. 10-最小生成树-Prim算法

    #include <iostream> #include <cstring> #include <cstdio> using namespace std; #def ...

  7. 循环结构之for循环

    循环结构之for循环(一) 在很多编程语言中都有一种直接.简单的循环,它的一般形式为: 它的执行过程如下: 第一步:执行表达式1,对循环变量做初始化: 第二步:判断表达式2,若其值为真(非0),则执行 ...

  8. 向对象(OO)程序设计

    http://www.uml.org.cn/mxdx/201208232.asp 前言 本文主要介绍面向对象(OO)程序设计,以维基百科的解释: 面向对象程序设计(英语:Object-oriented ...

  9. Web测试项目计划与安排

    本次Web测试项目实践的需求如下: 1 选中某一款产品(暂且选择博客园和CSDN进行横向比较),对被测产品进行评测: 2 进行用户调研: 3 对产品进行定量的评价: 4 对这个产品进行分析: 5 例会 ...

  10. shared_ptr / weak_ptr 代码片段

    参考<<Boost程序库完全开放指南>> shared_ptr  类摘要(只列出了常用的部分)和相关说明 template <class T> class shar ...