Rain on your Parade

Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 655350/165535 K (Java/Others)
Total Submission(s): 6752    Accepted Submission(s): 2117

Problem Description
You’re giving a party in the garden of your villa by the sea. The party is a huge success, and everyone is here. It’s a warm, sunny evening, and a soothing wind sends fresh, salty air from the sea. The evening is progressing just as you had imagined. It could be the perfect end of a beautiful day.
But nothing ever is perfect. One of your guests works in weather forecasting. He suddenly yells, “I know that breeze! It means its going to rain heavily in just a few minutes!” Your guests all wear their best dresses and really would not like to get wet, hence they stand terrified when hearing the bad news.
You have prepared a few umbrellas which can protect a few of your guests. The umbrellas are small, and since your guests are all slightly snobbish, no guest will share an umbrella with other guests. The umbrellas are spread across your (gigantic) garden, just like your guests. To complicate matters even more, some of your guests can’t run as fast as the others.
Can you help your guests so that as many as possible find an umbrella before it starts to pour?

Given the positions and speeds of all your guests, the positions of the umbrellas, and the time until it starts to rain, find out how many of your guests can at most reach an umbrella. Two guests do not want to share an umbrella, however.

 
Input
The input starts with a line containing a single integer, the number of test cases.
Each test case starts with a line containing the time t in minutes until it will start to rain (1 <=t <= 5). The next line contains the number of guests m (1 <= m <= 3000), followed by m lines containing x- and y-coordinates as well as the speed si in units per minute (1 <= si <= 3000) of the guest as integers, separated by spaces. After the guests, a single line contains n (1 <= n <= 3000), the number of umbrellas, followed by n lines containing the integer coordinates of each umbrella, separated by a space.
The absolute value of all coordinates is less than 10000.
 
Output
For each test case, write a line containing “Scenario #i:”, where i is the number of the test case starting at 1. Then, write a single line that contains the number of guests that can at most reach an umbrella before it starts to rain. Terminate every test case with a blank line.
 
Sample Input
2
1
2
1 0 3
3 0 3
2
4 0
6 0
1
2
1 1 2
3 3 2
2
2 2
4 4
 
Sample Output
Scenario #1:
2

Scenario #2:
2

 
Source
 
Recommend
lcy   |   We have carefully selected several similar problems for you:  2393 2390 2388 2391 2386 
 /*************************************************************************
> File Name: hdu-2389.rain_on_your_parade.cpp
> Author: CruelKing
> Mail: 2016586625@qq.com
> Created Time: 2019年09月02日 星期一 21时29分16秒
本题思路:比较裸的二分匹配,但是一看n比较大,所以需要更牛皮的算法,也即HK算法其复杂度为sqrt(n) * m.
************************************************************************/ #include <cstdio>
#include <cmath>
#include <cstring>
#include <vector>
#include <queue>
#include <map>
using namespace std; typedef long long ll;
const int maxn = + , inf = 0x3f3f3f3f;
int speed[maxn];
bool used[maxn];
int n, m, t;
typedef pair<int, int> pii;
pii umbrellas[maxn], guests[maxn];
int mx[maxn], my[maxn];
int dx[maxn], dy[maxn];
vector <int> G[maxn];
int dis; bool searchp() {
queue<int> que;
dis = inf;
memset(dx, -, sizeof dx);
memset(dy, -, sizeof dy);
for(int i = ; i <= m; i ++) {
if(mx[i] == -) {
que.push(i);
dx[i] = ;
}
}
while(!que.empty()) {
int u = que.front();
que.pop();
if(dx[u] > dis) break;
int sz = G[u].size();
for(int i = ; i < sz; i ++) {
int v = G[u][i];
if(dy[v] == -) {
dy[v] = dx[u] + ;
if(my[v] == -) dis = dy[v];
else {
dx[my[v]] = dy[v] + ;
que.push(my[v]);
}
}
}
}
return dis != inf;
} bool dfs(int u) {
int sz = G[u].size();
for(int i = ; i < sz;i ++) {
int v = G[u][i];
if(!used[v] && dy[v] == dx[u] + ) {
used[v] = true;
if(my[v] != - && dy[v] == dis) continue;
if(my[v] == - || dfs(my[v])) {
my[v] = u;
mx[u] = v;
return true;
}
}
}
return false;
} int maxmatch() {
int res = ;
memset(mx, -, sizeof mx);
memset(my, -, sizeof my);
while(searchp()) {
memset(used, false, sizeof used);
for(int i = ; i <= m;i ++) {
if(mx[i] == - && dfs(i)) res ++;
}
}
return res;
} bool has_distance(int i, int j) {
ll temp = (umbrellas[i].first - guests[j].first) * (umbrellas[i].first - guests[j].first) + (umbrellas[i].second - guests[j].second) * (umbrellas[i].second - guests[j].second);
return temp <= (ll)speed[j] * speed[j] * t * t;
} int main() {
int T, Case = ;
scanf("%d", &T);
while(T --) {
scanf("%d", &t);
scanf("%d", &m);
for(int i = ; i <= m; i ++) {
scanf("%d %d %d", &guests[i].first, &guests[i].second, &speed[i]);
}
scanf("%d", &n);
for(int i = ; i <= n; i ++) {
scanf("%d %d", &umbrellas[i].first, &umbrellas[i].second);
for(int j = ; j <= m; j ++) {
if(has_distance(i, j)) G[j].push_back(i);
}
}
int res = maxmatch();
for(int i = ; i <= m; i ++) G[i].clear();
printf("Scenario #%d:\n", ++Case);
printf("%d\n\n", res);
}
return ;
}

hdu-2389.rain on your parade(二分匹配HK算法)的更多相关文章

  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 3289 Rain on your Parade (二分图匹配 Hopcroft-Karp)

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

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

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

  6. HDU 2389 Rain on your Parade 最大匹配(模板题)【HK算法】

    <题目链接> 题目大意:有m个宾客,n把雨伞,预计时间t后将会下大雨,告诉你每个宾客的位置和速度,每把雨伞的位置,问你最多几个宾客能够拿到伞. 解题分析: 本题就是要我们求人与伞之间的最大 ...

  7. hdu 2444 The Accomodation of Students(二分匹配 匈牙利算法 邻接表实现)

    The Accomodation of Students Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K ( ...

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

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

  9. HDU 2389 Rain on your Parade

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

随机推荐

  1. php内置函数分析之current()、next()、prev()、reset()、end()

    current()初始指向插入到数组中的第一个单元 next() 将数组的内部指针向前移动一位 prev() 将数组的内部指针倒回一位 reset() 将数组的内部指针指向第一个单元 end() 将数 ...

  2. #pragma 的使用(转)

    尽管 C 和 C++ 都已经有标准,但是几乎每个编译器 (广义,包含连接器等) 扩展一些 C/C++ 关键字. 合理地应用这些关键字,有时候能使我们的工作非常方便.下面随便说说 Visual C++ ...

  3. 关于CSS你应该知道的基础知识 - 盒模型篇

    浏览器渲染引擎通过盒模型的方式来布局html元素.我们可以将每一个html元素都看做是一个盒子,每一个盒子都有长和款,多个这样的盒子组成了我们的网页. Margin,Border,Padding 每一 ...

  4. <el-menu>菜单标签(里面可以包括:<el-submenu>和<el-menu-item>)

    <el-menu> 1.router属性,若使用router属性menu-item的index将对应router的path属性 2.mode,下拉菜单的模式分为horizontal和ver ...

  5. CSS盒模型面试知识点

    一.基本概念 1.基本概念:标准盒模型+怪异盒模型(IE模型) 基本组成:由margin.padding.content组成. 2.标准盒模型和IE模型的区别 标准盒模型中width指的是内容区域co ...

  6. noi 1700 + 1756 八皇后问题 x

    1700:八皇后问题 总时间限制:  10000ms 内存限制:  65536kB 描述 在国际象棋棋盘上放置八个皇后,要求每两个皇后之间不能直接吃掉对方. 输入 无输入. 输出 按给定顺序和格式输出 ...

  7. [design pattern](1) Strategy

    引言 最近,在学习设计模式相关的知识.本博客主要想讲一讲策略模式,这也是我学习的第一个模式.写下这篇博客,主要想记录下个人的一点理解,也是想通过写博客的方式来加深对与Strategy的一点理解.以下的 ...

  8. Hash算法原理以及HashCode深入理解

    Java中的Collection有两类,一类是List,一类是Set.List内的元素是有序的,元素可以重复.Set元素无序,但元素不可重复.要想保证元素不重复,两个元素是否重复应该依据什么来判断呢? ...

  9. 深入探究JVM(1) - Java的内存区域解析

    http://blog.csdn.net/sczyh22/article/details/46652901<br>Java 虚拟机在执行Java程序的时候会把它管理的内存区域划为几部分,这 ...

  10. jquery.ui.widget.js