Hdu 3289 Rain on your Parade (二分图匹配 Hopcroft-Karp)
题目链接:
题目描述:
有n个客人,m把雨伞,在t秒之后将会下雨,给出每个客人的坐标和每秒行走的距离,以及雨伞的位置,问t秒后最多有几个客人可以拿到雨伞?
解题思路:
数据范围太大,匈牙利算法O(n*m)果断华丽丽的TLE,请教了一下度娘,发现还有一种神算法—— Hopcroft-Karp,然后就get√新技能,一路小跑过了,有一点不明白的是hdu上竟然有人0ms过,这又是什么神姿势(吓哭!!!!!),额.........,扯远了。
Hopcroft-Karp复杂度O(sqrt(n)*m),相比匈牙利算法优化在于,Hopcroft-Karp算法每次可以扩展多条不相交增广路径。
- #include <iostream>
- #include <cstring>
- #include <queue>
- #include <cmath>
- #include <cstdio>
- using namespace std;
- const int maxn = ;
- const int INF = 0x3f3f3f3f;
- struct node
- {
- int to, next;
- } edge[maxn*maxn+];
- struct point
- {
- double x, y, num;
- };
- point p_gue[maxn+], p_umb[maxn+];
- int head[maxn+], vis[maxn+], n, m, tot, dis;
- int cx[maxn+], cy[maxn+], dx[maxn+], dy[maxn+];
- void Add (int from, int to)
- {
- edge[tot].to = to;
- edge[tot].next = head[from];
- head[from] = tot ++;
- }
- bool bfs ()
- {//寻找多条无公共点的最短增广路
- queue <int> Q;
- dis = INF;
- memset (dx, -, sizeof(dx));
- //左边顶点i所在层编号
- memset (dy, -, sizeof(dy));
- //右边顶点i所在层编号
- for (int i=; i<=n; i++)
- if (cx[i] == -)
- {
- Q.push(i);
- dx[i] = ;
- }
- while (!Q.empty())
- {
- int u = Q.front();
- Q.pop();
- if (dx[u] > dis)
- break;
- for (int i=head[u]; i!=-; i=edge[i].next)
- {
- int v = edge[i].to;
- if (dy[v] == -)
- {
- dy[v] = dx[u] + ;
- if (cy[v] == -)
- dis = dy[v];
- else
- {
- dx[cy[v]] = dy[v] + ;
- Q.push(cy[v]);
- }
- }
- }
- }
- return dis != INF;
- }
- int dfs (int u)
- {//寻找路径
- for (int i=head[u]; i!=-; i=edge[i].next)
- {
- int v = edge[i].to;
- if (!vis[v] && dy[v] == dx[u]+)
- {
- vis[v] = ;
- if (cy[v]!=- && dis==dy[v])
- continue;
- if (cy[v]==- || dfs(cy[v]))
- {
- cy[v] = u;
- cx[u] = v;
- return ;
- }
- }
- }
- return ;
- }
- int Max_match ()
- {//得到最大匹配数目
- int res = ;
- memset (cx, -, sizeof(cx));
- //左边顶点i所匹配的右边的点
- memset (cy, -, sizeof(cy));
- //右边顶点i所匹配的左边的点
- while (bfs ())
- {
- memset (vis, , sizeof(vis));
- for (int i=; i<=n; i++)
- if (cx[i] == -)
- res += dfs(i);
- }
- return res;
- }
- int main ()
- {
- int cas, t, l = ;
- scanf ("%d", &cas);
- while (cas --)
- {
- scanf ("%d %d", &t, &n);
- for (int i=; i<=n; i++)
- {
- scanf ("%lf %lf %lf", &p_gue[i].x, &p_gue[i].y, &p_gue[i].num);
- p_gue[i].num *= t;
- }
- scanf ("%d", &m);
- for (int i=; i<=m; i++)
- scanf ("%lf %lf", &p_umb[i].x, &p_umb[i].y);
- memset (head, -, sizeof(head));
- tot = ;
- for (int i=; i<=n; i++)
- for (int j=; j<=m; j++)
- {
- double x = p_gue[i].x - p_umb[j].x;
- double y = p_gue[i].y - p_umb[j].y;
- double num = sqrt (x*x + y*y);
- if (num <= p_gue[i].num)
- Add (i, j);
- }
- printf ("Scenario #%d:\n%d\n\n", ++l, Max_match());
- }
- return ;
- }
Hdu 3289 Rain on your Parade (二分图匹配 Hopcroft-Karp)的更多相关文章
- 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 ...
- 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 ...
- 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 ...
- 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 ...
- HDU2389 Rain on your Parade —— 二分图最大匹配 HK算法
题目链接:https://vjudge.net/problem/HDU-2389 Rain on your Parade Time Limit: 6000/3000 MS (Java/Others) ...
- 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 ...
- HDU 5943 Kingdom of Obsession 【二分图匹配 匈牙利算法】 (2016年中国大学生程序设计竞赛(杭州))
Kingdom of Obsession Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Oth ...
- 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 ...
- HDU 2389 Rain on your Parade
大意:在一个二维坐标系上有nx个人和ny把伞,每个人都有自己的移动速度,问有多少人可以再 time 时间内移动到不同的雨伞处(不允许两个人共用一把伞). 输入数据: 第一行是一个T代表T组测试数据 ...
随机推荐
- 对CSS尺寸单位'em'的长期误解
一直以来认为'em'是相对于父元素的字体大小. 直到今天学习移动WEB开发,重新复习css的尺寸大小时,惊奇发现:对em深深的误解了!!! 在CSS官网对em的解释实例是: a. h1{line-he ...
- 【转】c++内存管理学习纲要
http://blog.csdn.net/zhanghefu/article/details/5003407 转自:http://blog.csdn.net/wdzxl198/article/deta ...
- 使用Android SwipeRefreshLayout了解Android的嵌套滑动机制
SwipeRefreshLayout 是在Android Support Library, revision 19.1.0加入到support v4库中的一个下拉刷新控件,关于android的下拉刷新 ...
- [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 ...
- Android NDK编程浅入深出之--Android.mk
Android.mk Android.mk是一个向Android NDK构建系统描写叙述NDK项目的GUN Makefile片段.它是每个NDK项目的必备组件. 构建系统希望它出如今jni子文 ...
- POJ 1125 Stockbroker Grapevine (Floyd最短路)
Floyd算法计算每对顶点之间的最短路径的问题 题目中隐含了一个条件是一个人能够同一时候将谣言传递给多个人 题目终于的要求是时间最短.那么就要遍历一遍求出每一个点作为源点时,最长的最短路径长是多少,再 ...
- ASP.NET MVC 提供与访问 Web Api
ASP.NET MVC 提供与访问 Web Api 一.提供一个 Web Api 新建一个项目,类型就选 "Web Api".我用的是MVC5,结果生成的项目一大堆东西,还编译不过 ...
- Ubuntu grub2的启动配置文件grub.cfg,为了修改另人生厌的时间
文章转自http://hi.baidu.com/detax/blog/item/90f18b54a8ef5253d00906e4.html 升级到Ubuntu 9.10后,就要接触grub2了,它和以 ...
- [Unity3D]Unity3D游戏开发之连续滚动背景
在诸如天天跑酷等2D游戏中.因为游戏须要表现出运动的感觉.通常都会使游戏背景连续循环滚动以增强视觉效果,那么今天.博主就来带领大家一起来实现连续滚动背景吧. 首先来讲述一下原理.准备两张连续的图片(博 ...
- linux怎么区别文本文件和二进制文件
linux的文本文件与二进制文件的区分与windows的区分是相同的!说到底计算机存储的文件都是以二进制形式存储的,但是区别是,习惯上认为: (1).文本文件 文本文件是包含用户可读信息的文件.这些文 ...