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

题意:

思路:
这道题目是最小割题目,但是吧你直接套用Dinic是会超时的。

这里有种很奇妙的做法啊,具体可以参见论文:《浅析最大最小定理在信息学竞赛中的应用》--周冬

S-T平面图:首先是一平面图(满足欧拉公式与存在对偶图),且源点S,汇点T在边界上。将S-T连线,将最外面的一个大面(无限大)一分为二了,一个为S,一个为T。然后将每条边两边的面相连,权值就是该边权值。最后跑最短路,它经过的路径就是原图中的边,最短路也就变成了最小割。

http://blog.csdn.net/ahero_happy/article/details/6637214该博主讲得不错,可以看一下。

一开始写了个最普通的最短路,结果超时。然后写了带队优化的,超内存了,因为用了vector来存储,最后只好改用数组来存储。

  1. /**************************************************************
  2. Problem: 1001
  3. User: Vortex
  4. Language: C++
  5. Result: Accepted
  6. Time:2112 ms
  7. Memory:89184 kb
  8. ****************************************************************/
  9.  
  10. #include<iostream>
  11. #include<algorithm>
  12. #include<cstring>
  13. #include<cstdio>
  14. #include<sstream>
  15. #include<vector>
  16. #include<stack>
  17. #include<queue>
  18. #include<cmath>
  19. #include<map>
  20. #include<set>
  21. using namespace std;
  22. typedef long long ll;
  23. typedef pair<int,int> pll;
  24. const int INF = 0x3f3f3f3f;
  25. const int maxn = ** + ;
  26.  
  27. int n, m;
  28. int num;
  29. int src, dst;
  30.  
  31. struct Edge
  32. {
  33. int v, w;
  34. int next;
  35. }edge[*maxn];
  36.  
  37. struct HeapNode
  38. {
  39. int d, u;
  40. HeapNode(int x, int y) :d(x), u(y){}
  41. bool operator < (const HeapNode& rhs) const{
  42. return d > rhs.d;
  43. }
  44. };
  45.  
  46. int head[maxn];
  47. bool done[maxn];
  48. int d[maxn];
  49.  
  50. void AddEdges(int u, int v, int w)
  51. {
  52. edge[num].v=v ;edge[num].w=w ;
  53. edge[num].next=head[u] ;head[u]=num++ ;
  54. }
  55.  
  56. void dijkstra(int s)
  57. {
  58. priority_queue<HeapNode> Q;
  59. for (int i = ; i <=dst; i++) d[i] = INF;
  60. d[s] = ;
  61. memset(done, , sizeof(done));
  62. Q.push(HeapNode(,s));
  63. while (!Q.empty())
  64. {
  65. HeapNode x = Q.top(); Q.pop();
  66. int u = x.u;
  67. if (done[u]) continue;
  68. done[u] = true;
  69. for (int i = head[u]; i!=-; i=edge[i].next)
  70. {
  71. if (d[edge[i].v] > d[u] + edge[i].w)
  72. {
  73. d[edge[i].v] = d[u] + edge[i].w;
  74. Q.push(HeapNode(d[edge[i].v],edge[i].v));
  75. }
  76. }
  77. }
  78. }
  79.  
  80. int main()
  81. {
  82. //freopen("in.txt","r",stdin);
  83. while(~scanf("%d%d",&n,&m))
  84. {
  85. src=,dst=*(n-)*(m-)+;
  86.  
  87. memset(head,-,sizeof(head));
  88. num=;
  89.  
  90. for(int i=;i<=n;i++)
  91. {
  92. for(int j=;j<m;j++)
  93. {
  94. int u,v,w;
  95. scanf("%d",&w);
  96. if(i==) u=src;
  97. else u=(*(i-)-)*(m-)+j;
  98. if(i==n) v=dst;
  99. else v=(*(i-))*(m-)+j;
  100. AddEdges(u,v,w);
  101. AddEdges(v,u,w);
  102. }
  103. }
  104.  
  105. for(int i=;i<n;i++)
  106. {
  107. for(int j=;j<=m;j++)
  108. {
  109. int u,v,w;
  110. scanf("%d",&w);
  111. if(j==) u=dst;
  112. else u=(*(i-))*(m-)+j-;
  113. if(j==m) v=src;
  114. else v=(*(i-))*(m-)+j-+m;
  115. AddEdges(u,v,w);
  116. AddEdges(v,u,w);
  117. }
  118. }
  119.  
  120. for(int i=;i<n;i++)
  121. {
  122. for(int j=;j<m;j++)
  123. {
  124. int u,v,w;
  125. scanf("%d",&w);
  126. u=(*(i-))*(m-)+j;
  127. v=(*(i-)+)*(m-)+j;
  128. AddEdges(u,v,w);
  129. AddEdges(v,u,w);
  130. }
  131. }
  132.  
  133. dijkstra(src);
  134. printf("%d\n",d[dst]);
  135. }
  136. return ;
  137. }

BZOJ 1001: [BeiJing2006]狼抓兔子(s-t平面图+最短路求最小割)的更多相关文章

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

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

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

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

  3. BZOJ 1001: [BeiJing2006]狼抓兔子【最大流/SPFA+最小割,多解】

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

  4. BZOJ 1001 [BeiJing2006]狼抓兔子 (UVA 1376 Animal Run)

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

  5. BZOJ 1001: [BeiJing2006]狼抓兔子(最短路)

    平面图的最小割转化为对偶图的最短路(资料:两极相通——浅析最大最小定理在信息学竞赛中的应用) ,然后DIJKSTRA就OK了. ------------------------------------ ...

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

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

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

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

  8. 【刷题】BZOJ 1001 [BeiJing2006]狼抓兔子

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

  9. bzoj 1001: [BeiJing2006]狼抓兔子 平面图最小割

    平面图跑最大流 可以转换为其对偶图跑最短路 一个环对应一个割  找到最小环(即最短路)极为所求,注意辅助边的建立 加入读入优化  不过时间还是一般  估计是dij写的不好   大神勿喷~~~ /*** ...

随机推荐

  1. OA系统部署短信过程

    安装dotNetFx40_Client_setup.exe插件 安装mysql_installer_community_V5.6.21.1_setup.1415604646.msi数据库 根据数据库版 ...

  2. SQL Server 安装后改动计算机名带来的问题以及解决方法

    USE master GO DECLARE @serverproperty_servername varchar(100), @servername varchar(100) --取得Windows ...

  3. 15 jmeter分布式性能测试

    背景由于jmeter本身的瓶颈,当需要模拟数以千计的并发用户时,使用单台机器模拟所有的并发用户就有些力不从心,甚至还会引起Java内存溢出的错误.要解决这个问题,可以使用分布式测试,运行多台机器运用所 ...

  4. clientHeight , scrollHeight , offsetHeight之间的区别

    clientHeight:元素客户区的大小,指的是元素内容及其边框所占据的空间大小(经过实践取出来的大多是视口大小) scrollHeight: 滚动大小,指的是包含滚动内容的元素大小(元素内容的总高 ...

  5. PAT Sign In and Sign Out[非常简单]

    1006 Sign In and Sign Out (25)(25 分) At the beginning of every day, the first person who signs in th ...

  6. PNG格式图片常见转换方法

    前言 最近碰到一个需要将图片由原始的PNG转化为JPG的需求,由于PNG图片本身质量等原因,导致转化为JPG之后,存在失真的问题,后来一个同事分享了下述的HighQualityPNGToJPG方法解决 ...

  7. .NET 互联网技术简介

    概述 技术更新太快,尤其是在互联网公司里,很多新的主流技术,我们还是必须要知道和熟练使用的.下面就给大家简单介绍,入门还是需要大家更努力的去深入学习. 目录 Git 入门 常用软件安装及VS插件工具 ...

  8. Android下基于线程池的网络访问基础框架

    引言 现在的Android开发很多都使用Volley.OkHttp.Retrofit等框架,这些框架固然有优秀的地方(以后会写代码学习分享),但是我们今天介绍一种基于Java线程池的网络访问框架. 实 ...

  9. cygwin本地.bashrc配置

    echo -e "====================================================================================== ...

  10. uva1330 在一个大的矩阵中寻找面积最大的子矩阵

    大白书 P50页 #include <algorithm> #include <cstdio> using namespace std; ; int ma[maxn][maxn ...