hdu-2389.rain on your parade(二分匹配HK算法)
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
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.
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.
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
2
Scenario #2:
2
/*************************************************************************
> 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算法)的更多相关文章
- 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 3289 Rain on your Parade (二分图匹配 Hopcroft-Karp)
题目链接: Hdu 3289 Rain on your Parade 题目描述: 有n个客人,m把雨伞,在t秒之后将会下雨,给出每个客人的坐标和每秒行走的距离,以及雨伞的位置,问t秒后最多有几个客人可 ...
- 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 ...
- HDU 2389 Rain on your Parade 最大匹配(模板题)【HK算法】
<题目链接> 题目大意:有m个宾客,n把雨伞,预计时间t后将会下大雨,告诉你每个宾客的位置和速度,每把雨伞的位置,问你最多几个宾客能够拿到伞. 解题分析: 本题就是要我们求人与伞之间的最大 ...
- hdu 2444 The Accomodation of Students(二分匹配 匈牙利算法 邻接表实现)
The Accomodation of Students Time Limit: 5000/1000 MS (Java/Others) Memory Limit: 32768/32768 K ( ...
- 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
大意:在一个二维坐标系上有nx个人和ny把伞,每个人都有自己的移动速度,问有多少人可以再 time 时间内移动到不同的雨伞处(不允许两个人共用一把伞). 输入数据: 第一行是一个T代表T组测试数据 ...
随机推荐
- Top 8 Diagrams for Understanding Java
Reference: http://www.programcreek.com/2013/09/top-8-diagrams-for-understanding-java/ A diagram is s ...
- 【leetcode】1169. Invalid Transactions
题目如下: A transaction is possibly invalid if: the amount exceeds $1000, or; if it occurs within (and i ...
- React使用的思考总结
1.事件处理中的this指针问题 在 react 中,用 class 声明一个组件,调用 class 中的方法时,如果该方法中有 this 且没有手动绑定 this 指针,则会发生 this 指向 u ...
- 在asp.net 中怎样上传文件夹
以ASP.NET Core WebAPI 作后端 API ,用 Vue 构建前端页面,用 Axios 从前端访问后端 API ,包括文件的上传和下载. 准备文件上传的API #region 文件上传 ...
- SQL 查询表字段长度, 名称, 类型, 存储过程创建和修改时间
获取存储过程的修改时间和创建时间查询建立时间 --表 select * from sysobjects where id=object_id(N'表名') and xtype='U' --表的结构 s ...
- CF 696 A Lorenzo Von Matterhorn(二叉树,map)
原题链接:http://codeforces.com/contest/696/problem/A 原题描述: Lorenzo Von Matterhorn Barney lives in NYC. ...
- RedisTemplate访问Redis数据结构(前言)
Redis五种基本数据结构 redis提供键值对的形式对数据进行存储.支持五种数据类型:String(字符串),List(链表),Hash(散列),Set(无序集合),ZSet(有序集合).下面是网上 ...
- idea生成get/set方法
如图:
- es之IK分词器
1:默认的分析器-- standard 使用默认的分词器 curl -XGET 'http://hadoop01:9200/_analyze?pretty&analyzer=standard' ...
- 手把手教你做echarts图表系列之组织结构图
在实际项目中使用echarts越来越多了,今天从一个组织结构图开始,手把手教大家开发echarts图表. 公司里的组织结构图如下: 可以参考echarts入门教程:http://echarts.bai ...