题目链接:

  Hdu 3289 Rain on your Parade

题目描述:
  有n个客人,m把雨伞,在t秒之后将会下雨,给出每个客人的坐标和每秒行走的距离,以及雨伞的位置,问t秒后最多有几个客人可以拿到雨伞?

解题思路:

  数据范围太大,匈牙利算法O(n*m)果断华丽丽的TLE,请教了一下度娘,发现还有一种神算法—— Hopcroft-Karp,然后就get√新技能,一路小跑过了,有一点不明白的是hdu上竟然有人0ms过,这又是什么神姿势(吓哭!!!!!),额.........,扯远了。

   Hopcroft-Karp复杂度O(sqrt(n)*m),相比匈牙利算法优化在于,Hopcroft-Karp算法每次可以扩展多条不相交增广路径。

  1. #include <iostream>
  2. #include <cstring>
  3. #include <queue>
  4. #include <cmath>
  5. #include <cstdio>
  6. using namespace std;
  7.  
  8. const int maxn = ;
  9. const int INF = 0x3f3f3f3f;
  10. struct node
  11. {
  12. int to, next;
  13. } edge[maxn*maxn+];
  14. struct point
  15. {
  16. double x, y, num;
  17. };
  18. point p_gue[maxn+], p_umb[maxn+];
  19. int head[maxn+], vis[maxn+], n, m, tot, dis;
  20. int cx[maxn+], cy[maxn+], dx[maxn+], dy[maxn+];
  21.  
  22. void Add (int from, int to)
  23. {
  24. edge[tot].to = to;
  25. edge[tot].next = head[from];
  26. head[from] = tot ++;
  27. }
  28.  
  29. bool bfs ()
  30. {//寻找多条无公共点的最短增广路
  31. queue <int> Q;
  32. dis = INF;
  33. memset (dx, -, sizeof(dx));
  34. //左边顶点i所在层编号
  35. memset (dy, -, sizeof(dy));
  36. //右边顶点i所在层编号
  37. for (int i=; i<=n; i++)
  38. if (cx[i] == -)
  39. {
  40. Q.push(i);
  41. dx[i] = ;
  42. }
  43. while (!Q.empty())
  44. {
  45. int u = Q.front();
  46. Q.pop();
  47. if (dx[u] > dis)
  48. break;
  49. for (int i=head[u]; i!=-; i=edge[i].next)
  50. {
  51. int v = edge[i].to;
  52. if (dy[v] == -)
  53. {
  54. dy[v] = dx[u] + ;
  55. if (cy[v] == -)
  56. dis = dy[v];
  57. else
  58. {
  59. dx[cy[v]] = dy[v] + ;
  60. Q.push(cy[v]);
  61. }
  62. }
  63. }
  64. }
  65. return dis != INF;
  66. }
  67. int dfs (int u)
  68. {//寻找路径
  69. for (int i=head[u]; i!=-; i=edge[i].next)
  70. {
  71. int v = edge[i].to;
  72. if (!vis[v] && dy[v] == dx[u]+)
  73. {
  74. vis[v] = ;
  75. if (cy[v]!=- && dis==dy[v])
  76. continue;
  77. if (cy[v]==- || dfs(cy[v]))
  78. {
  79. cy[v] = u;
  80. cx[u] = v;
  81. return ;
  82. }
  83. }
  84. }
  85. return ;
  86. }
  87. int Max_match ()
  88. {//得到最大匹配数目
  89. int res = ;
  90. memset (cx, -, sizeof(cx));
  91. //左边顶点i所匹配的右边的点
  92. memset (cy, -, sizeof(cy));
  93. //右边顶点i所匹配的左边的点
  94. while (bfs ())
  95. {
  96. memset (vis, , sizeof(vis));
  97. for (int i=; i<=n; i++)
  98. if (cx[i] == -)
  99. res += dfs(i);
  100. }
  101. return res;
  102. }
  103. int main ()
  104. {
  105. int cas, t, l = ;
  106. scanf ("%d", &cas);
  107. while (cas --)
  108. {
  109. scanf ("%d %d", &t, &n);
  110. for (int i=; i<=n; i++)
  111. {
  112. scanf ("%lf %lf %lf", &p_gue[i].x, &p_gue[i].y, &p_gue[i].num);
  113. p_gue[i].num *= t;
  114. }
  115.  
  116. scanf ("%d", &m);
  117. for (int i=; i<=m; i++)
  118. scanf ("%lf %lf", &p_umb[i].x, &p_umb[i].y);
  119.  
  120. memset (head, -, sizeof(head));
  121. tot = ;
  122. for (int i=; i<=n; i++)
  123. for (int j=; j<=m; j++)
  124. {
  125. double x = p_gue[i].x - p_umb[j].x;
  126. double y = p_gue[i].y - p_umb[j].y;
  127. double num = sqrt (x*x + y*y);
  128. if (num <= p_gue[i].num)
  129. Add (i, j);
  130. }
  131. printf ("Scenario #%d:\n%d\n\n", ++l, Max_match());
  132. }
  133. return ;
  134. }

Hdu 3289 Rain on your Parade (二分图匹配 Hopcroft-Karp)的更多相关文章

  1. hdu2389 Rain on your Parade 二分图匹配--HK算法

    You’re giving a party in the garden of your villa by the sea. The party is a huge success, and every ...

  2. HDU 2389 Rain on your Parade / HUST 1164 4 Rain on your Parade(二分图的最大匹配)

    HDU 2389 Rain on your Parade / HUST 1164 4 Rain on your Parade(二分图的最大匹配) Description You're giving a ...

  3. HDU 2389 Rain on your Parade(二分匹配,Hopcroft-Carp算法)

    Rain on your Parade Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 655350/165535 K (Java/Ot ...

  4. HDU 2389 ——Rain on your Parade——————【Hopcroft-Karp求最大匹配、sqrt(n)*e复杂度】

    Rain on your Parade Time Limit:3000MS     Memory Limit:165535KB     64bit IO Format:%I64d & %I64 ...

  5. HDU2389 Rain on your Parade —— 二分图最大匹配 HK算法

    题目链接:https://vjudge.net/problem/HDU-2389 Rain on your Parade Time Limit: 6000/3000 MS (Java/Others)  ...

  6. hdu-2389.rain on your parade(二分匹配HK算法)

    Rain on your Parade Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 655350/165535 K (Java/Ot ...

  7. HDU 5943 Kingdom of Obsession 【二分图匹配 匈牙利算法】 (2016年中国大学生程序设计竞赛(杭州))

    Kingdom of Obsession Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Oth ...

  8. hdu2389二分图之Hopcroft Karp算法

    You're giving a party in the garden of your villa by the sea. The party is a huge success, and every ...

  9. HDU 2389 Rain on your Parade

    大意:在一个二维坐标系上有nx个人和ny把伞,每个人都有自己的移动速度,问有多少人可以再 time 时间内移动到不同的雨伞处(不允许两个人共用一把伞).   输入数据: 第一行是一个T代表T组测试数据 ...

随机推荐

  1. 对CSS尺寸单位'em'的长期误解

    一直以来认为'em'是相对于父元素的字体大小. 直到今天学习移动WEB开发,重新复习css的尺寸大小时,惊奇发现:对em深深的误解了!!! 在CSS官网对em的解释实例是: a. h1{line-he ...

  2. 【转】c++内存管理学习纲要

    http://blog.csdn.net/zhanghefu/article/details/5003407 转自:http://blog.csdn.net/wdzxl198/article/deta ...

  3. 使用Android SwipeRefreshLayout了解Android的嵌套滑动机制

    SwipeRefreshLayout 是在Android Support Library, revision 19.1.0加入到support v4库中的一个下拉刷新控件,关于android的下拉刷新 ...

  4. [RxJS] Create a Reusable Operator from Scratch in RxJS

    With knowledge of extending Subscriber and using source.lift to connect a source to a subscriber, yo ...

  5. Android NDK编程浅入深出之--Android.mk

        Android.mk Android.mk是一个向Android NDK构建系统描写叙述NDK项目的GUN Makefile片段.它是每个NDK项目的必备组件. 构建系统希望它出如今jni子文 ...

  6. POJ 1125 Stockbroker Grapevine (Floyd最短路)

    Floyd算法计算每对顶点之间的最短路径的问题 题目中隐含了一个条件是一个人能够同一时候将谣言传递给多个人 题目终于的要求是时间最短.那么就要遍历一遍求出每一个点作为源点时,最长的最短路径长是多少,再 ...

  7. ASP.NET MVC 提供与访问 Web Api

    ASP.NET MVC 提供与访问 Web Api 一.提供一个 Web Api 新建一个项目,类型就选 "Web Api".我用的是MVC5,结果生成的项目一大堆东西,还编译不过 ...

  8. Ubuntu grub2的启动配置文件grub.cfg,为了修改另人生厌的时间

    文章转自http://hi.baidu.com/detax/blog/item/90f18b54a8ef5253d00906e4.html 升级到Ubuntu 9.10后,就要接触grub2了,它和以 ...

  9. [Unity3D]Unity3D游戏开发之连续滚动背景

    在诸如天天跑酷等2D游戏中.因为游戏须要表现出运动的感觉.通常都会使游戏背景连续循环滚动以增强视觉效果,那么今天.博主就来带领大家一起来实现连续滚动背景吧. 首先来讲述一下原理.准备两张连续的图片(博 ...

  10. linux怎么区别文本文件和二进制文件

    linux的文本文件与二进制文件的区分与windows的区分是相同的!说到底计算机存储的文件都是以二进制形式存储的,但是区别是,习惯上认为: (1).文本文件 文本文件是包含用户可读信息的文件.这些文 ...