题目链接:

  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算法每次可以扩展多条不相交增广路径。

 #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)的更多相关文章

  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. 使用datatables实现后台分页功能,减轻前端渲染压力

    注意不同版本,参数名字及参数内容存在差异,具体可以参考https://datatables.net/upgrade/1.10-convert#Options 控制页面显示的参数:https://dat ...

  2. dnsmasq possible DNS-rebind attack detected错误

    最近在做openwrt的平台,dns使用的是dnsmasq,但是通过板子上网,将PC的dns设置成板子的时候,发现百度等都可以,但是公司邮箱打不开.公司邮箱的域名 xx-xx-notes.xxx.co ...

  3. composer-安装插件包

    上一步完成后,选定国内镜像地址,以为下载插件包做准备 https://pkg.phpcomposer.com/ 安装完componser后使用下面这条命令即可(设置国内镜像地址): composer ...

  4. hdoj2680 Choose the best route

    Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission ...

  5. 【PA2013】【BZOJ3733】Iloczyn

    Description 给定正整数n和k,问是否能将n分解为k个不同正整数的乘积 Input 第一行一个数T(T<=4000)表示測试组数 接下来T行每行两个数n(n<=10^9),k(k ...

  6. Orange's_1_win7下搭建环境

    工欲善其事,必先利其器. 由于公司电脑工作环境是win7,为了学习于渊的Orange,所以就在windows下配置环境:   1.nasm: nasm汇编 http://www.nasm.us/    ...

  7. Mac下Apache+MySQL+PHP安装

    max下是自带有Apache和php的服务器的,不需要另外安装,本文就对相关配置进行介绍. 第一:Apache 在终端中输入,下面指令即可启动Apache服务器: //启动 sudo apachect ...

  8. iOS开发——高级篇——多线程dispatch_apply

    我们知道遍历数组是一个相对耗时的操作,而同时手机的核是越来越多,所以我们需要充分利用iOS多核的作用. 特别是在遍历操作中还有其他耗时操作.像我们平时直接遍历数组的操作 ,i< ,i++){ / ...

  9. C项目实践--网络协议和套接字编程

    1.TCP/IP协议 TCP/IP协议是一组包括TCP协议和IP协议,UDP(User Datagram Protocol)协议,ICMP(Internet Control Message Proto ...

  10. Oracle常用SQL与练习

    基本 数学函数 rownum相关 分页查询 (假设每页显示10条) 不包含排序: 包含排序: 时间处理 1. to_char和to_date基本使用 eg1: eg2: 2)months_betwee ...