<题目链接>

题目大意:
有m个宾客,n把雨伞,预计时间t后将会下大雨,告诉你每个宾客的位置和速度,每把雨伞的位置,问你最多几个宾客能够拿到伞。

解题分析:

本题就是要我们求人与伞之间的最大匹配,但是数据量较大,匈牙利算法复杂度为$O(n \times m)$,会超时,所以这里用的是复杂度为$O(\sqrt{n} \times m)$的HK算法。

当然,本题也可以用Dinic最大流来求解最大匹配,并且这种方法求得到最大匹配的时间复杂度也为$O(sqrt(n)*m)$

#include <bits/stdc++.h>
using namespace std;
#define INF 0x3f3f3f3f
const int M = +;
struct point{
double x,y,s;
}a[M],b[M];
bool map[M][M];
bool vis[M];
int dx[M],dy[M];/*dx[i]表示左集合i顶点的距离编号,dy[i]表示右集合i顶点的距离编号,还有就是这里就是bfs找增广路用的数组 对于u-->v可达就有dy[v] = dx[u] + 1 */
int cx[M],cy[M];
int dis;
int n,T,m;
bool searchpath()
{
queue<int>q;
dis=INF;
memset(dx,-,sizeof(dx));
memset(dy,-,sizeof(dy));
for(int i=;i<=n;i++)
{
//cx[i]表示左集合i顶点所匹配的右集合的顶点序号
if(cx[i]==-)
{
//将未遍历的节点 入队 并初始化次节点距离为0
q.push(i);
dx[i]=;
}
}
//广度搜索增广路径
while(!q.empty())
{
int u=q.front();
q.pop();
if(dx[u]>dis) break;
//取右侧节点,所以用m。
for(int v=;v<=m;v++)
{
//右侧节点的增广路径的距离
if(map[u][v]&&dy[v]==-)
{
dy[v]=dx[u]+;//v对应的距离 为u对应距离加1
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 v=;v<=m;v++)
{
//如果该点没有被遍历过 并且距离为上一节点+1
if(map[u][v]&&!vis[v]&&dy[v]==dx[u]+)
{
//对该点染色,即是进行标记
vis[v]=true;
if(cy[v]!=-&&dy[v]==dis)
continue;
if(cy[v]==-||dfs(cy[v]))
{
cx[u]=v;
cy[v]=u;
return ;
}
}
}
return ;
}
//得到最大匹配的数目
int MaxMatch()
{
memset(cx,-,sizeof(cx));
memset(cy,-,sizeof(cy));
int res=;
while(searchpath())
{
memset(vis,false,sizeof(vis));
for(int i=;i<=n;i++)
{
if(cx[i]==-)
res+=dfs(i);
}
}
return res;
}
int main()
{
int t,k=;
scanf("%d",&t);
while(t--)
{
memset(map,false,sizeof(map));
scanf("%d",&T);
scanf("%d",&n);
for(int i=;i<=n;i++)
scanf("%lf%lf%lf",&a[i].x,&a[i].y,&a[i].s);
scanf("%d",&m);
for(int i=;i<=m;i++)
scanf("%lf%lf",&b[i].x,&b[i].y);
for(int i=;i<=n;i++)
for(int j=;j<=m;j++)
{
if(a[i].s*T>=sqrt((a[i].x-b[j].x)*(a[i].x-b[j].x)+(a[i].y-b[j].y)*(a[i].y-b[j].y)))
map[i][j]=true;
}
int ans=MaxMatch();
printf("Scenario #%d:\n%d\n\n",k++,ans);
}
}

HK

HDU 2389 Rain on your Parade 最大匹配(模板题)【HK算法】的更多相关文章

  1. 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 ...

  2. 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 ...

  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

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

  5. Hdu 3289 Rain on your Parade (二分图匹配 Hopcroft-Karp)

    题目链接: Hdu 3289 Rain on your Parade 题目描述: 有n个客人,m把雨伞,在t秒之后将会下雨,给出每个客人的坐标和每秒行走的距离,以及雨伞的位置,问t秒后最多有几个客人可 ...

  6. HDOJ 2389 Rain on your Parade

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

  7. HDU 4280:Island Transport(ISAP模板题)

    http://acm.hdu.edu.cn/showproblem.php?pid=4280 题意:在最西边的点走到最东边的点最大容量. 思路:ISAP模板题,Dinic过不了. #include & ...

  8. HDU 4347 - The Closest M Points - [KDTree模板题]

    本文参考: https://www.cnblogs.com/GerynOhenz/p/8727415.html kuangbin的ACM模板(新) 题目链接:http://acm.hdu.edu.cn ...

  9. HDU 2089 不要62(数位dp模板题)

    http://acm.hdu.edu.cn/showproblem.php?pid=2089 题意:求区间内不包含4和连续62的数的个数. 思路: 简单的数位dp模板题.给大家推荐一个好的讲解博客.h ...

随机推荐

  1. swift 学习- 24 -- 协议 01

    // 协议 定义了一个蓝图, 规定了用来实现某一特定任务或者功能的方法, 属性, 以及其他需要的东西. // 类, 结构体, 或 枚举都可以遵循协议, 并且为协议定义的这些要求 提供具体的实现, 某个 ...

  2. Confluence 6 重构查找索引

    查找索引是自动维护的,但是你有时候可能会因为你在查找的时候或查看者邮件主题出现了异常,或者你的 Confluence 实例升级到了新的版本,你可能需要手动重构索引. 进行搜索索引重构: 在屏幕的右上角 ...

  3. Confluence 6 设置 Oracle 数据库准备

    请查看 Supported Platforms 页面来获得 Confluence 系统支持的 Oracle 数据库版本.你需要在安装 Confluence 之前升级你的 Oracle 数据库. 如果你 ...

  4. Confluence 6 数据库支持的驱动

    数据库 驱动已捆绑? JDBC 驱动 备注 更多信息 PostgreSQL 9.4-1202 JDBC 41 driver download 我们推荐你使用 JDBC 4 的驱动. 如果你希望使用更新 ...

  5. Linux下source命令详解

    source命令用法 source FileName source命令作用 在当前bash环境下读取并执行FileName中的命令. *注:该命令通常用命令“.”来替代. 使用范例: source f ...

  6. Python面向对象 三大特性 综合案例

    class Animal: # 所用的知识 Animal类的封装 -> Dog类,Cat类,Person类的继承->多态 # 把所有的共同属性和方法封装在一个公有类里面让子类继承父类的方法 ...

  7. Spring4.x 基础

    把以下 jar 包加入到工程的 classpath 下: 搭建Spring开发环境 Spring 的配置文件: 一个典型的 Spring 项目需要创建一个或多个 Bean 配置文件, 这些配置文件用于 ...

  8. Android NDK开发调试

    ndk-stack: https://developer.android.com/ndk/guides/ndk-stack?hl=zh-cn JNI开发: https://developer.andr ...

  9. js数字货币格式互转

    //将1,234,567.00转换为1234567.00 function moneyToNumValue(val) { var num = val.trim(); var ss = num.toSt ...

  10. 最长k可重区间集问题&&最长k可重线段集问题

    题解: 洛谷上这两题的题意都是有问题的 按照标程题意不应该是开区间而是左开右闭区间 然后连边比较巧妙 我们可以看成选k条不相交的路径,其中i-i+1中有k条边 所以建图i-i+1流量为k,权值为0 l ...