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组测试数据 ...
随机推荐
- CEF3研究(四)之javascript集成
一.介绍 谷歌浏览器和CEF使用V8JavaScript Engine作为内容的JavaScript实现.在浏览器中的每个窗口都有它自己在的JS上下文提供作用域和在窗口中安全的执行JS代码.CEF暴露 ...
- 【转载】《Unix网络编程》思维导图
参考这篇文章,很不错: http://www.cnblogs.com/qiaoconglovelife/p/5734768.html
- java quartz的使用,做时间轮询调用 CronTrigger
import org.quartz.Job; import org.quartz.JobExecutionContext; import org.quartz.JobExecutionExceptio ...
- 弄技术要弄通-公司reis的pub/sub怎么使用的呢?
Pub/Sub in Redis using PHP Posted on November 14, 2011by xmeng I would like to put an example togeth ...
- linux上安装启动elasticsearch-5.5.1完整步骤
linux上安装启动elasticsearch-5.5.1完整步骤 学习了:https://blog.csdn.net/hingcheung/article/details/77144574 http ...
- Zookeeper 简单操作
1. 连接到zookeeper服务 [java2000_wl@localhost zookeeper-3]$ bin/zkCli.sh -server 127.0.0.1:2181 也可以连接远端的 ...
- 项目实战之玩转div+css制作自己定义形状
项目需求 watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/diss ...
- LruCache & DiskLruCache
在用户界面(UI)加载一张图片时很简单,然而,如果你需要加载多张较大的图像,事情就会变得更加复杂,.在许多情况下(如与像的ListView GridView或ViewPager的组件),屏幕上的图片的 ...
- 多媒体开发之wis-stream
在live555的mediaServer中,已经实现RTSP-over-HTTP,但默认没有开启.如果要实现这个功能,需要调用RTSPServer::setUpTunnelingOverHTTP(), ...
- web 界面设计---大道至简
http://www.cnblogs.com/coder2012/p/4023442.html 一个非常精简的webpy页面博客 qing.weibo.com 新浪的轻微博也不错精简